Autor Zpráva
gelfi
Profil *

1 <?php
2 class A {
3 private function show() {
4 echo "A";
5 }
6 public function __construct() {
7 $this->show();
8 }
9 }
10 class B extends A{
11 private function show() {
12 echo "B";
13 }
14 }
15 new A;
16 new B;
17 ?>

Cekal bych ze se vypise AB, ale vypise se AA. Konstruktor se zdedil, ale vola metodu predka. Metody jsou prece virtualni, tak by se mel podivat jestli jsem nepredefinoval metodu show() a pouzit ji. Jak to 'donutit' vypsat spravne AB, abych nemusel znovu opisovat konstruktor. Pozn: Volana metoda nemusi byt nutne v konstruktoru.
Snad jsem to vysvetlil dobre. Diky
ph@tE
Profil *
gelfi
Stačí učinit metodu show() chráněnou a bude ti to vypisovat AB, přesně, jak si přeješ. Nevím, jestli jsou v PHP metody defaultně virtuální (neslyšel jsem o tom), ale řekl bych, že PHP sleduje přepisování metod pouze pokud jsou chráněné nebo veřejné. Jestliže jsou soukromé, pak PHP s prohledáváním zděděných tříd končí, protože metoda show() definovaná ve třídě A patří pouze třídě A a metoda show() definovaná ve třídě B zase pouze třídě B. Není proto možné zavolat metodu show() třídy B ze třídy A.
gelfi
Profil *
ph@tE
Diky. Strucne a jasne. Nasledujici kod uz vypisuje AB.

To, ze jsou vsechny metody virtualni jsem sebral z PHP v objetí objektů (4) uplne dole:
V PHP je celá situace snadnější: "virtuálními" jsou jednoduše úplně všechny metody.
At z toho taky neco mas:)

Problem byl vyresen. Dekuji
gelfi
Profil *
Uz opraveny kod:

1 <?php
2 class A {
3 protected function show() {
4 echo "A";
5 }
6 public function __construct() {
7 $this->show();
8 }
9 }
10 class B extends A{
11 protected function show() {
12 echo "B";
13 }
14 }
15 new A;
16 new B;
17 ?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0