|
Categorieën >
Object georiënteerd
Singleton en meerdere objecten
|
|
|
offline
|
PHP expert
|
Op dit moment spoken er allerlei gedachten door me hoofd betreffende singleton.
Ik wil graag hetvolgende principe bereiken:
<?php
class Singleton {
private static $aInstances = array();
public function getInstance ($name) {
if(isset($this->aInstances[$name]) {
// Instantie van de class bestaat al dus geef deze terug
return $this->aInstances[$name];
} else {
// Instantie van de class bestaat nog niet
$this->aInstances[$name] = new $name();
return $this->aInstances[$name];
}
}
}
// Voorbeeld van $aInstances kan dus zijn:
private static $aInstances = array(
'db' => ( object ) db class,
'blog' => ( object ) blog class
);
?>
<?php class Singleton { public function getInstance ($name) { if(isset($this->aInstances[$name]) { // Instantie van de class bestaat al dus geef deze terug return $this->aInstances[$name]; } else { // Instantie van de class bestaat nog niet $this->aInstances[$name] = new $name(); return $this->aInstances[$name]; } } } // Voorbeeld van $aInstances kan dus zijn: 'db' => ( object ) db class, 'blog' => ( object ) blog class ); ?>
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)
<?php
private static $aInstances = array(
'db' => array( 0 => array( ( object ) db class, 'localhost', 'root', 'foo',
1 => array( ( object ) db class, '12.34.57.89', 'admin', 'bar' ),
'blog' => ( object ) blog class
);
?>
<?php 'db' => array( 0 => array( ( object ) db class, 'localhost', 'root', 'foo', 1 => array( ( object ) db class, '12.34.57.89', 'admin', 'bar' ), 'blog' => ( object ) blog class ); ?>
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
MiST – 31/08/2010 21:47
|
|
offline
|
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
|
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
|
PHP expert
|
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
|
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
|
PHP expert
|
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
|
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 
- ...
|
avdg – 31/08/2010 22:57
|
|
offline
|
PHP gevorderde
|
vergeet method __clone niet in te vullen, meestal volstaat het om em protected te declareren
protected function __clone() {
}
protected function __clone() { }
|
|
|
|
offline
|
Erelid
|
/me votes ConnectionManager maken... is logischer
|
MiST – 01/09/2010 16:38
|
|
offline
|
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
|
PHP expert
|
En voor templates dan? Een template manager?
|
Dit onderwerp is gesloten.
|
|
|