Autor wpisu: batman, dodany: 30.03.2010 20:00, tagi: zend_framework
Autor wpisu: Nikodem Ośmiałowski, dodany: 29.03.2010 20:50, tagi: kohana, php
Autor wpisu: Zyx, dodany: 29.03.2010 10:41, tagi: php
Autor wpisu: batman, dodany: 28.03.2010 18:29, tagi: php
Autor wpisu: batman, dodany: 27.03.2010 09:20, tagi: php
Autor wpisu: cojack, dodany: 26.03.2010 10:58, tagi: php
Dzisiaj w pracy kolega się mnie spytał czy jest taka możliwość by z klasy rodzica wywołać metodę w klasie dziecka, której nie ma w klasie rodzica. Urodził mi się uśmiech na twarzy i odparłem nie ma takiej możliwości, z logicznego pkt widzenia to jest awykonalne by w klasie bazowej móc wywołać metody z klasy, która dziedziczy nie definiując ich w tejże klasie bazowej. No ale spójrzmy co nam nasze php oferuje.
class A { public function __construct(){ $this->fuck(); } } class B extends A { public function __construct() { parent::__construct(); } public function fuck() { echo "yo\n"; } } $objB = new B();
A teraz zgadnijcie jaki będzie wynik, otóż zaskoczę Was, wynik to yo. A teraz wytłumaczenie dlaczego tak to działa:
“Obiekt jeszcze przed wywołaniem konstruktora klasy A już posiada wszystkie metody klasy B”
Innymi słowy metody są przypisane do obiektu a nie do klasy.
A żeby jeszcze było śmieszniej to kolejność wykonywania funkcji, popatrzcie sami:
class A { public function __construct(){ $this->fuck(); } public function fuck() { echo "wow\n"; } } class B extends A { public function __construct() { parent::__construct(); } public function fuck() { echo "yo\n"; parent::fuck(); } } $objB = new B();
W kolejności wywoła się : yo a następnie wow. Dla mnie to powinna być pętla wow -> yo -> wow, a oczywiście jest inaczej.
Boże zlituj się nad developerami php i nie zważaj na grzechy ich.