PHP类与对象中的private访问控制的疑问
在手册中的疑惑:关于PHP类继承与方法的调用
在浏览手册时,遇到了一个令人费解的问题,特地记录下来,分享给遇到类似情况的朋友们。
考虑以下PHP代码:
```php
class Bar {
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic";
}
private function testPrivate() {
echo "Bar::testPrivate";
}
}
class Foo extends Bar {
public function testPublic() {
echo "Foo::testPublic";
}
private function testPrivate() {
echo "Foo::testPrivate";
}
}
$myFoo = new Foo();
$myFoo->test();
// 输出:Bar::testPrivate // Foo::testPublic
```
为何第一行会输出"Bar::testPrivate"呢?当我们创建Foo类的实例并调用其test方法时,按照常规理解,应该首先调用Foo类的testPrivate方法,而不是Bar类的testPrivate方法。事实并非如此。在PHP中,当一个对象调用一个方法时,首先会在该类中查找该方法。如果找不到,则会在其父类中进行查找。这就是所谓的“方法顺序”。在这个例子中,由于Foo类没有定义testPrivate方法,所以PHP会在Bar类中查找,并调用Bar类的testPrivate方法。输出为"Bar::testPrivate"。接着,它会调用Foo类的testPublic方法,输出"Foo::testPublic"。至于“cambrian.render('body')”,似乎是与该问题无关的代码片段或可能是特定环境下的代码。