Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] singleton odwolanie do obiektu i metody w pliku include
!*!
post 21.07.2011, 11:56:20
Post #1





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
bastard13
post 21.07.2011, 13:24:39
Post #2





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
!*!
post 22.07.2011, 10:52:27
Post #3





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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?


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 10:02