login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Singleton Design Pattern (Opgelost)

Offline Ultimatum - 16/08/2007 13:08
Avatar van UltimatumPHP expert Ey, ik heb nu dit ergens gevonden en zolang de functie die ik wil "include" geen paramters heeft werkt het goed. Maar bijvoorbeeld mijn database class heeft 4 parameters mar ik krijg het niet voor elkaar om die parameters mee te geven in die class. Dit is de class
  1. <?php
  2. include './inc/class/database.php';
  3. include './inc/class/log.php';
  4.  
  5. class singleton {
  6.  
  7. public static function &getInstance($class) {
  8.  
  9. static $instances = array();
  10.  
  11. if(!array_key_exists($class, $instances)) {
  12.  
  13. $instances[$class] = new $class();
  14.  
  15. }
  16.  
  17. $instance =& $instances[$class];
  18.  
  19. return $instance;
  20.  
  21. }
  22. }
  23. ?>


En zo roep ik het aan:
  1. <?php
  2. include './inc/class/singleton.php';
  3.  
  4. $db =& singleton::getInstance('Database', array($config['host'], $config['user'], $config['pass'], $config['data']));
  5. $log =& singleton::getInstance('Log');
  6. ?>


Iemand die me kan helpen.

18 antwoorden

Gesponsorde links
Offline Rik - 16/08/2007 13:10
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
  1. static $instances = array();
Dat hoort toch niet binnen die functie te staan?
Offline Ultimatum - 16/08/2007 13:12
Avatar van Ultimatum PHP expert Owjah, dat is dan een foutje die ik verkeerd heb overgenomen. Heb je nog andere opmerkingen? 
Offline marten - 16/08/2007 13:12
Avatar van marten Beheerder Misschien kan je hier iets mee.
http://www.phpf...id=1034634
Offline Ultimatum - 16/08/2007 13:18
Avatar van Ultimatum PHP expert
marten schreef:
Misschien kan je hier iets mee.
http://www.phpf...id=1034634

Ik kan hier niet echt een oplossing vinden? Het probleem daar is dat er 2 verschillende databasetypes moeten zijn en geen parameters..
Offline Rik - 16/08/2007 13:20 (laatste wijziging 16/08/2007 13:22)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Ik had net alleen ff snel gekeken, maar ik zie nog een fout.  
  1. $instances
Als je die static variabele binnen de class wilt gebruiken moet je hem aanroepen met:
  1. self::$instances


Edit:
  1. $instance =& $instances[$class];
Je maakt eerst de variabele $instance aan en die return je daarna. Is
  1. return &$instances[$class];
dan niet makkelijker?
Offline Ultimatum - 16/08/2007 13:26 (laatste wijziging 16/08/2007 13:29)
Avatar van Ultimatum PHP expert I don't know . Ik heb het ook maar van een site afgeplukt omdat ik er geen zak van snap. Maar ik kan nog steeds niets vinden, lijkt wel of niemand dit probleem heeft .

Ik heb het nu wat aangepast maar ik krijg nu alleen maar errors:
Citaat:
Strict Standards: Assigning the return value of new by reference is deprecated in D:programsxampphtdocs***incclasssingleton.php on line 13

Parse error: syntax error, unexpected '&' in D:programsxampphtdocs***incclasssingleton.php on line 17


Dit is wat ik nu heb:
  1. <?php
  2. include './inc/class/database.php';
  3. include './inc/class/log.php';
  4.  
  5. class singleton {
  6.  
  7. static $instances = array();
  8.  
  9. public static function &getInstance($class) {
  10.  
  11. if(!array_key_exists($class, $instances)) {
  12.  
  13. $instances[$class] =& new $class();
  14.  
  15. }
  16.  
  17. return &$instances[$class];
  18.  
  19. }
  20. }
  21. ?>


Edit: Alle \ verdwijnen in en quote..
Offline Rik - 16/08/2007 13:34 (laatste wijziging 16/08/2007 13:38)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Zo te zien klopt dat wat ik net in m'n edit zei niet. 

Edit:
* klik * duidelijk stukje over singleton. 
Offline Gerard - 16/08/2007 15:06
Avatar van Gerard Ouwe rakker Kijk die tutorial van Koen nog eens door. Want het is niet de bedoeling dat je 1 class maakt genaamd 'singleton' en daar vanuit alles regelt. Op die manier moet je bij implementatie van een nieuwe class ook deze weer aanpassen. Je krijgt dan dus een soort afhankelijkheid, iets wat niet gewenst is.
Offline Ultimatum - 16/08/2007 16:18 (laatste wijziging 16/08/2007 16:28)
Avatar van Ultimatum PHP expert @boukefalos, bedankt, even kijken .

@Proximus, hoebedoel je? Op deze manier word elke class toch maar 1 keer geinstancierd? En dat is toch precies de bedoeling?

Edit: nu loop ik weer tegen het oorspronkelijke probleem aan: ik kon geen parameters aan een class meegeven als dat nodig is.
Gebruik ik hier dan singleton wel goed of niet? Want zover ik weet was werd dit toch vaak gebruik icm singleton (Classe instancieren). Laat me even weten als dat niet het geval is ofzo..
Offline Stijn - 16/08/2007 17:19
Avatar van Stijn PHP expert Bij getInstance moet je een tweede optionele parameter zetten. Die tweede is een array met eventuele contructor options. De & is niet nodig voor new $class want die geeft een E_STRICT error in PHP5. In PHP4 gebruik je wel de &.

  1. <?php
  2. funtion __autoload($class)
  3. {
  4. include_once './inc/class/' . strtolower( $class );
  5. }
  6.  
  7. /* class singleton */
  8. class singleton {
  9.  
  10. private static $_instances = array();
  11.  
  12. public static function &getInstance( $class , array $options = array()) {
  13.  
  14. if(!array_key_exists($class, self::$_instances)) {
  15.  
  16. if( count($options) > 0 ) {
  17. self::$_instances[$class] = new $class( implode(',' , $options) );
  18. } else {
  19. self::$_instances[$class] = new $class();
  20. }
  21.  
  22. }
  23.  
  24. return self::_$instances[$class]; //geen & want de return is al een reference (je functie is reference-by-return)
  25.  
  26. }
  27. }
  28. ?>
Deze code zou moeten werken.
Offline Ultimatum - 16/08/2007 17:25
Avatar van Ultimatum PHP expert Er zaten wat foutjes in maar kan gebeuren 
regel 2: function verkeerd geschreven
regel 24: na :: en _ verkeerd.

Maar als ik het nou zo run:
  1. <?php
  2. $db = singleton::getInstance('Database', array($config['host'], $config['user'], $config['pass'], $config['data']));
  3. $log = singleton::getInstance('Log');
  4. ?>


Krijg ik onderstaande error, hij splits de argumenten dus niet goed want hij pakt alleen de eerste.

Citaat:
Warning: Missing argument 2 for Database::__construct(), called in D:programsxampphtdocs***incclasssingleton.php on line 17 and defined in D:programsxampphtdocs***incclassdatabase.php on line 8

Warning: Missing argument 3 for Database::__construct(), called in D:programsxampphtdocs***incclasssingleton.php on line 17 and defined in D:programsxampphtdocs***incclassdatabase.php on line 8

Warning: Missing argument 4 for Database::__construct(), called in D:programsxampphtdocs***incclasssingleton.php on line 17 and defined in D:programsxampphtdocs***incclassdatabase.php on line 8
Offline Rik - 16/08/2007 18:18
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Het gaat mis bij:
  1. self::$_instances[$class] = new $class( implode(',' , $options) )


Met implode maak je een string van de argumenten dus uiteindelijk krijg je maar één argument. Ik ga nu even opzoeken hoe je dat kunt verhelpen, volgens mij kon je dit makkelijk met een of andere functie doen. 
Offline marten - 16/08/2007 18:42
Avatar van marten Beheerder array_push() helpt hierbij PHP.net: array_push
Offline Ultimatum - 16/08/2007 18:54
Avatar van Ultimatum PHP expert
Boukefalos schreef:
Het gaat mis bij:[..code..]

Met implode maak je een string van de argumenten dus uiteindelijk krijg je maar één argument. Ik ga nu even opzoeken hoe je dat kunt verhelpen, volgens mij kon je dit makkelijk met een of andere functie doen. 

Ik wacht af 

marten schreef:
array_push() helpt hierbij PHP.net: array_push

maar options is toch al een array? Dus je maakt van een array een nieuwe array. Heb het trouwens geprobeerd maar nog steeds zelfde error.
Offline Stijn - 16/08/2007 19:13
Avatar van Stijn PHP expert Mhz anders moet je eens kijken om PHP.net: func_get_args te zetten in je __constuct ofzo ik dacht dat die implode zou werken. jammer.
Offline Rik - 16/08/2007 20:35
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Dit heb ik ervan gebrouwen:
  1. class Singleton {
  2. private static $_instances = array();
  3. public static function &getInstance($class) {
  4. if (!array_key_exists($class, self::$_instances)) {
  5. if (func_num_args() > 1) {
  6. $arguments = array();
  7. $code = array();
  8. for ($i = 1; $i < func_num_args(); $i++) {
  9. $arguments[] = func_get_arg($i);
  10. $code[] = '$arguments[' . ($i - 1) . ']';
  11. }
  12. self::$_instances[$class] = eval('return new $class(' . implode(', ', $code) . ');');
  13. } else {
  14. self::$_instances[$class] = new $class;
  15. }
  16. }
  17. return self::$_instances[$class];
  18. }
  19. }
Als je hem aanroept met
  1. Singleton::getInstance('database', 'arg1', 'arg2', 'enz');
krijgt de __construct 'arg1', 'arg2' en 'enz' als argumenten mee.
Offline Gerard - 16/08/2007 22:11
Avatar van Gerard Ouwe rakker
Ultimatum schreef:
@boukefalos, bedankt, even kijken .

@Proximus, hoebedoel je? Op deze manier word elke class toch maar 1 keer geinstancierd? En dat is toch precies de bedoeling?

Edit: nu loop ik weer tegen het oorspronkelijke probleem aan: ik kon geen parameters aan een class meegeven als dat nodig is.
Gebruik ik hier dan singleton wel goed of niet? Want zover ik weet was werd dit toch vaak gebruik icm singleton (Classe instancieren). Laat me even weten als dat niet het geval is ofzo..


De singleton constructie moet je in de class zelf aanmaken. Dus die getInstance() methode moet in je db class komen. Het moet geen centrale class zijn die het voor jou bijhoudt. Dan ben je namelijk niet echt bezig met singleton maar met een Registry Pattern.
Offline Ultimatum - 16/08/2007 22:38
Avatar van Ultimatum PHP expert @Boukefalos, bedankt het werkt nu eindelijk .

Proximus schreef:
[..quote..]

De singleton constructie moet je in de class zelf aanmaken. Dus die getInstance() methode moet in je db class komen. Het moet geen centrale class zijn die het voor jou bijhoudt. Dan ben je namelijk niet echt bezig met singleton maar met een Registry Pattern.


Maar als ik het nu via deze classe doe en dan in de config dan heb ik toch alles in 1? En zo staat het ook op andere site, wil niet zeggen dat die juist zijn ofzo..
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.287s