Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Singleton i dziedziczenie
joohn
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 10.12.2007

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


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
Powód edycji: Zmiana kolorowania /~strife/
Go to the top of the page
+Quote Post
ayeo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


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?

Ten post edytował ayeo 17.12.2007, 00:41:08


--------------------
Go to the top of the page
+Quote Post
joohn
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 10.12.2007

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


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 ''
Go to the top of the page
+Quote Post
ayeo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


No i wszystko jasne! To jest błąd PHP! Tutaj link:
http://www.mail-archive.com/php-bugs@lists...t/msg85053.html
Pozdrawiam!


--------------------
Go to the top of the page
+Quote Post
splatch
post
Post #5





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Zapraszam do noty na blogu udata.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
joohn
post
Post #6





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 10.12.2007

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


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.
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 Aktualny czas: 19.08.2025 - 13:12