Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Singleton i dziedziczenie
Forum PHP.pl > Forum > PHP > Object-oriented programming
joohn
Witam, mam taki prosty problem:

Bazowa klasa sesji mojego frameworka:

  1. <?php
  2. class BaseSession
  3.  {
  4. protected static $instance = null;
  5.  
  6. //deny cloning of object
  7. private function __clone(){}
  8. private function __construct(){}
  9.  
  10. /**
  11.  * @return UserSession Session object
  12.  */
  13. public function getInstance()
  14. {
  15. return ($i = &self::$instance) ? $i : $i = new self;
  16. }
  17. }
  18. ?>


Klasa dziedzicząca, implementująca już konkretną funkcjonalność dla danej aplikacji:

  1. <?php
  2. class DerivedSession extends BaseSession
  3. {
  4.  
  5. //jakies funkcje...
  6. }
  7. ?>


Problem polega na tym, ze w entry-poincie mojej aplikacji robie tak, zeby singleton zainicjalizowal sie tym dziedziczonym obiektem:

$tmp = DerivedSession::getInstance();

Mimo tego tworzy mi sie obiekt typu BaseSession! Jeżeli w klasie DerivedSession skopiuje metodę getInstance z definicją taką jaka jest w BaseSession, wszystko działa zgodnie z oczekiwaniami, czyli powyższy kod tworzy obiekt klasy DerivedSession.

Czy w takim razie to jest normalne zachowanie dla OOP w PHP, jeżeli wywołuje funkcje statyczną w kontekscie klasy dziedziczącej (bez przeciążania tej funkcji), to "self" w dalszym ciągu odnosi się do klasy bazowej?

Pozdrawiam
Adam
ayeo
Ja dołączam się do pytania i jeszcze proszę o wyjaśnienie jednej kwestii. Mianowicie w PHP metody prywatne nie są dziedziczone więc dlaczego działa konstruktor w tym przykładzie?

EDIT: już wiem smile.gif konstruktor jest wywoływany metodą getInstance(), która jest zdefiniowana w klasie bazowej więc ma dostę do prywatnych metod. Co jeśli przeciążymy metodę getInstace() w klasie dziedziczącej? Nie powinna ona już mieć dostępu do prywatnego konstruktora klasy bazowej... Czemu więc johnemu działa?
joohn
Dokładnie tak.
Jeżeli przeciąże metodę getInstance w klasie dziedziczącej (z implementacją jak w bazowej) kod działa!
Na początku myślałem, że tworzy się domyślny konstruktor publiczny, ale nie...
gdy wywołam:

CODE
$tmp = new DerivedSession()


PHP zgłasza błąd:
Fatal error: Call to private BaseSession::__construct() from context ''
ayeo
No i wszystko jasne! To jest błąd PHP! Tutaj link:
http://www.mail-archive.com/php-bugs@lists...t/msg85053.html
Pozdrawiam!
splatch
Zapraszam do noty na blogu udata.
joohn
Teraz to już rzeczywiście wszystko jasne smile.gif
Dzięki chłopaki, rozwialiście moje wątpliwości. Czyli pozostaje czekać na nowego PHP a póki co się zrobi work-around.
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.