![]() |
![]() ![]() |
![]() |
![]()
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:
Klasa dziedzicząca, implementująca już konkretną funkcjonalność dla danej aplikacji:
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/
|
|
|
![]()
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 (IMG:http://forum.php.pl/style_emoticons/default/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 |
|
|
![]()
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 '' |
|
|
![]()
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! |
|
|
![]()
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.
|
|
|
![]()
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 (IMG:http://forum.php.pl/style_emoticons/default/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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 16:59 |