login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Singleton en meerdere objecten (Opgelost)

Offline marten - 31/08/2010 21:02
Avatar van martenBeheerder Op dit moment spoken er allerlei gedachten door me hoofd betreffende singleton.
Ik wil graag hetvolgende principe bereiken:

  1. <?php
  2. class Singleton {
  3. private static $aInstances = array();
  4. public function getInstance ($name) {
  5. if(isset($this->aInstances[$name]) {
  6. // Instantie van de class bestaat al dus geef deze terug
  7. return $this->aInstances[$name];
  8. } else {
  9. // Instantie van de class bestaat nog niet
  10. $this->aInstances[$name] = new $name();
  11. return $this->aInstances[$name];
  12. }
  13. }
  14. }
  15.  
  16. // Voorbeeld van $aInstances kan dus zijn:
  17. private static $aInstances = array(
  18. 'db' => ( object ) db class,
  19. 'blog' => ( object ) blog class
  20. );
  21.  
  22. ?>


Echter wat gebeurt er nu als je wel meerdere db connecties wil hebben met verschillende connectie parameters?

Simpel zullen de meeste zeggen:
Maak je $aInstances in een vorm als deze (vlugge schets)

  1. <?php
  2. private static $aInstances = array(
  3. 'db' => array( 0 => array( ( object ) db class, 'localhost', 'root', 'foo',
  4. 1 => array( ( object ) db class, '12.34.57.89', 'admin', 'bar' ),
  5. 'blog' => ( object ) blog class
  6.  
  7. );
  8. ?>


Echter heb ik meerdere topics en reacties gelezen over Singleton. Het zou dus eigenlijk niet mogen hoe bovenstaande oplossing werkt. Nu is mijn vraag, wat is dan een betere methode hiervoor?

10 antwoorden

Gesponsorde links
Offline MiST - 31/08/2010 21:47
Avatar van MiST Lid Ja, veel blijft er niet meer over van de definitie van een singleton...

Ik zou een ConnectieManager maken die volgens het Singleton Design pattern is geimplementeerd, en daar dan je array op invoegen.

zodat je krijgt: ConnManager->getInstance()->getConn('blog') of iets dergelijks 

Zoiets wat je in gedachten hebt? 
Offline Button - 31/08/2010 21:51
Avatar van Button PHP ver gevorderde Eigenlijk wil je iets maken wat het idee van Singleton tegenspreekt. Je wil meerdere objecten (connecties) van 1 klasse aanmaken. Achter Singleton zit juist het idee dat 1 object overal gebruikt wordt.

Nu, ik vind het idee wat jij voorstelt niet slecht. Als het voor jouw toepassing zo werkt, zie ik er geen probleem in.
Offline marten - 31/08/2010 21:56
Avatar van marten Beheerder
Citaat:
Eigenlijk wil je iets maken wat het idee van Singleton tegenspreekt. Je wil meerdere objecten (connecties) van 1 klasse aanmaken. Achter Singleton zit juist het idee dat 1 object overal gebruikt wordt.


Daarom spoken de gedachten juist door me hoofd. Wat zou ik dan moeten gebruiken welke beide scenarios netjes kan dekken? Dus en de mogelijkheid om 1 instantie van elk object te laden. (helper class instanties ) en om meerdere instanties te maken (db class instanties, TemplatePower class instanties)
Offline Button - 31/08/2010 22:01
Avatar van Button PHP ver gevorderde Ik vind je oplossing niet slecht, zoals ik al zei hierboven. Het is toch geen probleem dat je het Singleton pattern aanpast omdat het zo beter werkt voor jouw toepassing?
Offline marten - 31/08/2010 22:02
Avatar van marten Beheerder Mja ik wil gewoon de beste oplossing hebben ik weet wel dat deze oplossing werkt, maar denk ook dat er betere oplossingen zijn. Vandaar dit topic. Zo kunnen jullie meedenken
Offline Button - 31/08/2010 22:19
Avatar van Button PHP ver gevorderde Je kan verschillende wegen opgaan:
- zoals MiST zei, een (Connectie-)Manager die de verschillende objecten van connecties stuurt. En dan een "single" object van die Manager.
- of gewoon 1 instantie van de db klasse en daar via parameters de connecties regelen (eigenlijk maak je dan van db klasse een manager
- of je doet het zoals jij het nu doet 
- ...
Offline avdg - 31/08/2010 22:57
Avatar van avdg PHP gevorderde vergeet method __clone niet in te vullen, meestal volstaat het om em protected te declareren 

  1. protected function __clone() {
  2.  
  3. }
Offline Maarten - 01/09/2010 12:50
Avatar van Maarten Erelid /me votes ConnectionManager maken... is logischer 
Bedankt door: marten
Offline MiST - 01/09/2010 16:38
Avatar van MiST Lid
marten schreef:
Mja ik wil gewoon de beste oplossing hebben 


In software ontwerp bestaat er doorgaans geen "beste" oplossing. Er zijn er meestal meerdere oplossingen en elke oplossing heeft zo zijn voor- en nadelen.

De keuze ligt dan volledig bij jou. Ga (alle) mogelijke alternatieven af, zet de voor- en nadelen op een rijtje, en elimineer.

Het gaat erom keuzes te maken, en die maak je gewoon in functie van je noden.
Offline marten - 02/09/2010 18:33
Avatar van marten Beheerder En voor templates dan? Een template manager?
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.184s