2015-07-10 15 views
10
<?php 
class A { 
    private function foo() { 
     echo "baf!<br/>"; 
    } 
    public function test() { 
     $this->foo(); 

    } 
} 


class C extends A { 
    private function foo() { 
     echo "bar!<br/>"; 
    } 

} 

$c = new C(); 
$c->test(); //Prints baf! 
?> 

Wie man c->test() zum Drucken bar machen! ? Ich habe erwartet, dass foo() in C übersteuert wird und bar drucken würde! Kann mir das jemand erklären?PHP inherience Methode Referenzierung

Antwort

7

Indem Sie beide Methoden schützen, erreichen Sie das gewünschte Ergebnis; Der Grund dafür ist, dass innerhalb A::test() es nur $this->foo() zu A::foo() wegen der Sichtbarkeit private auflösen kann. Siehe Visibility.

class A { 
    protected function foo() { 
     echo "baf!<br/>"; 
    } 
    public function test() { 
     $this->foo(); 

    } 
} 


class C extends A { 
    protected function foo() { 
     echo "bar!<br/>"; 
    } 

} 

$c = new C(); 
$c->test(); //Prints bar! 
+0

'foo' von C kann privat sein, oder? – prakharsingh95

+0

@ prakharsingh95 Nein, es muss auch "geschützt" sein wie in der Klasse 'A'. –

+1

@ pracharsingh95 Eigenschaft und Methoden können höhere Sichtbarkeit oder die gleiche Sichtbarkeit in vererbten Klasse sein, aber es kann nicht weniger Sichtbarkeit sein. sonst wird es fatalen Fehler zeigen – varuog

0
class A { 
    protected function foo() { 
     echo "baf!<br/>"; 
    } 
    public function test() { 
     $this->foo(); 

    } 
} 


class C extends A { 
    protected function foo() { 
     echo "bar!<br/>"; 
    } 

} 
$c = new C(); 
$c->test(); //Prints baf! 

nur sowohl die foo Funktion als öffentliche oder geschützte Zugriffsebene machen.