login  Naam:   Wachtwoord: 
Registreer je!
 Forum

singleton

Offline Raze - 12/04/2010 15:46 (laatste wijziging 12/04/2010 15:47)
Avatar van RazePHP beginner Hallo,

ik ben wat aan het proberen met singleton en dit is wat ik voorlopig heb:

  1. <?php
  2.  
  3. class sng
  4. {
  5. public $data = array();
  6.  
  7. public $objects = array();
  8.  
  9. private static $instance;
  10.  
  11. public function __construct()
  12. {
  13. }
  14.  
  15. public function __clone()
  16. {
  17. throw new exception( "Cloning is not allowed" );
  18. }
  19.  
  20. public static function singleton()
  21. {
  22. if( !isset( self::$instance ) )
  23. {
  24. $c = __CLASS__;
  25. self::$instance = new $c;
  26. }
  27.  
  28. return self::$instance;
  29. }
  30.  
  31. public function registerClass( $key , $classname )
  32. {
  33. $this->objects[$key] = new $classname;
  34. }
  35.  
  36. public function useClass( $key )
  37. {
  38. return $this->objects[$key];
  39. }
  40.  
  41. public function putData( $value )
  42. {
  43. $this->data[] = $value;
  44.  
  45. return count($this->data)-1;
  46. }
  47.  
  48. public function getData( $key )
  49. {
  50. if( is_numeric( $key ) )
  51. {
  52. return $this->data[$key];
  53. }
  54. else
  55. {
  56. throw new exception( "Key value is not valid (not an integer)" );
  57. }
  58. }
  59. }
  60.  
  61. class testclass
  62. {
  63. public function somefunction()
  64. {
  65. echo "Foo Bar";
  66. }
  67. }
  68.  
  69. $test = sng::singleton();
  70. $test->registerClass('tc','testclass');
  71. $test->useClass('tc')->somefunction();
  72. ?>

Dit werkt allemaal.

allereerst: maak ik op de juiste manier gebruik van het singleton-principe (of hoe je dat ook noemt)?
En dan een de vraag:
ik zou graag willen dat ik functies van andere klasses op de volgende manier zou kunnen aanspreken:
  1. $test = sng::singleton()->registerclass('tc','testclass')->useClass('tc');
  2. $test->somefunction();


op dit moment werkt die manier nog niet. Wat doe ik fout?

1 antwoord

Gesponsorde links
Offline Stijn - 14/04/2010 00:07
Avatar van Stijn PHP expert Je moet je constructor ook private maken en niet public. Anders kan je new sng(); doen.

Om die onderste code fragment werkende te krijgen moet je bij de functie registerclass een tweede regeltje code toevoegen: return $this;. Dan geef je een referentie terug van je sng klasse en kan je de methode useclass() oproepen ervan.

Anders klopt alles.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.328s