我不明白为什么代码的第一个输出打印“Bar :: testPrivate”,因为我们使用子类的instance.So调用父类的测试方法,当在测试中调用第一行代码时函数是“$ this-> testPrivate();”应该调用子类的testPrivate方法,因此打印“Foo :: testPrivate”而不是“Bar :: testPrivate”。
<pre>
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
</pre>
答案 0 :(得分:1)
您的班级Foo
没有test()
方法。您可以致电$myFoo->test()
,因为方法test()
是从类Bar
继承的。您必须覆盖类test()
中的方法Foo
,就像使用方法testPrivate()
和testPublic()
一样。
你正在调用基类的方法是正确的,但在这种情况下Bar
是你的基类。查看示例here。
答案 1 :(得分:1)
如果您希望从基类(父)类继承所有函数,那么您应该在子类中显式调用它的构造函数。否则,您将需要覆盖这些方法。此外,当使用实际实例(即您创建了一个对象)时,声明为private
的函数仅对该类可用。对将继承该函数的类使用protected
。 e.g:
class Foo {
public function __construct() {
echo "Foo constructed...\n";
$this->fooOnly();
}
private function fooOnly() {
echo "Called 'fooOnly()'\n"; //Only available to class Foo
}
protected function useThisFoo() {
echo "Called 'useThisFoo()'\n"; //Available to Foo and anything that extends it.
}
}
class Bar extends Foo {
public function __construct() {
parent::__construct(); //Now Bar has everything from Foo
}
public function testFooBar() {
//$this->fooOnly(); //Fail - private function
$this->useThisFoo(); //Will work - protected function is available to Foo and Bar
}
}
$bar = new Bar();
$bar->testFooBar(); //Works - public function will internally call protected function.
//$bar->fooOnly(); //Fail - private function can't be accessed in global space
//$bar->useThisFoo(); //Fail again - protected function can't be access in global space