Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] singleton odwolanie do obiektu i metody w pliku include
Forum PHP.pl > Forum > Przedszkole
!*!
index.php

  1. final class Load
  2. {
  3. private static $oInstance = false;
  4. public $name;
  5. public static function getInstance($name)
  6. {
  7. if( self::$oInstance == false )
  8. {
  9. self::$oInstance = new $name();
  10. }
  11. return self::$oInstance;
  12. }
  13.  
  14. private function __construct() {}
  15.  
  16. } // end class Load
  17.  
  18.  
  19.  
  20.  
  21. class NextClass
  22. {
  23. public function __construct()
  24. {
  25. echo '<br />To jest klasa: '.(__CLASS__);
  26. }
  27.  
  28. public function metoda()
  29. {
  30. echo '<br />to jest metoda: '.(__METHOD__);
  31.  
  32. }
  33.  
  34. }
  35.  
  36.  


wywolanie:

  1. Load::getInstance('NextClass')->metoda();


Wyswietli

  1. To jest klasa: NextClass
  2. to jest metoda: NextClass::metoda


A jeśli w pliku index.php dam include jakiegoś pliku a w nim:

  1. class Mapaa
  2. {
  3. public function __construct()
  4. {
  5. echo '<br />To jest klasa: '.(__CLASS__);
  6. }
  7.  
  8.  
  9. public function pozycja()
  10. {
  11. echo '<br />jakaś tam';
  12. }
  13. }


odwolanie:
  1. Load::getInstance('Mapaa')->pozycja();


Dostaję komunikat:

  1. Fatal error: Call to undefined method NextClass::pozycja() in (tu linia pliku właśnie z tym odwolaniem)


Chciałbym uzyskać efekt tworzenia obiektu i ładowania ich metod bez Tworzenia dla nich zmiennych w stylu:

  1. $cos = new Cos();
  2. $cos->metoda();


Tak aby takie odwołanie działało wszędzie, w każdym includowanym pliku, bez użycia $GLOBAL. Czy jest to możliwe? Dodam że wszystkie czynności, zachodzą w pliku index.php.
bastard13
argument klasy Load $oInstance jeste statyczny i w chwili, gdy wykonujesz metodę getInstance($name), jeżeli jest on pusty, to tworzy instancję obiektu klasy $name i zwraca ją. Jeżeli instancja jest już utworzona (drugie i każde kolejne wywołanie metody), to w wyniku dostaniesz obiekt, który został utworzony przy pierwszym wywołaniu.
Błąd dostajesz, bo pewnie masz coś takiego:
  1. Load::getInstance('NextClass')->metoda(); //getInstance() tworzy instancję obiektu NextClass
  2. //tutaj jakiś kod
  3. Load::getInstance('Mapaa')->pozycja(); //w argumencie $oInstance klasy Load jest już instancja obiektu (NextClass), więc zostaje zwrócona


Tak poza tym to, co napisałeś nie jest implementacją wzorca Sinleton. Singleton zaimplementowany na przykładzie klasy NextClass:
  1. class NextClass{
  2. private static $_instance = null;
  3. public static function getInstance() {
  4. if(self::$instance === null)
  5. self::$instance = new self();
  6.  
  7. return self::$instance;
  8. }
  9. private function __construct();
  10. private function __clone();
  11. }

Implementacja tego wzorca zapewnia, że zostanie utworzony tylko jeden obiekt danej klasy.
!*!
bastard13 - tylko że jak dam new NextClass::$_instance; a później new NextClass to i tak zostanie zainicjalizowany obiekt. A jak to zrobić, aby można było wykonać new NextClass tylko raz?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.