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')”,似乎是与该问题无关的代码片段或可能是特定环境下的代码。
编程语言
- PHP类与对象中的private访问控制的疑问
- JS判断输入的字符串是否是数字的方法(正则表达
- js去掉首位空格的正则表达式
- node跨域转发 express+http-proxy-middleware的使用
- 简单谈谈PHP中strlen 函数
- 微信小程序搭建及解决登录失败问题
- vue 实现在函数中触发路由跳转的示例
- asp.net利用反射实现给model类赋值的方法
- 原生js实现class的添加和删除简单代码
- 浅谈关于angularJs中使用$.ajax的注意点
- 使用XSL将XML文档中的CDATA注释输出为HTML文本
- 解决在Laravel 中处理OPTIONS请求的问题
- vue使用v-if v-show页面闪烁,div闪现的解决方法
- DW 查找某字符串前的所有字符的正则表达式
- Thinkphp5.0 框架视图view的比较标签用法分析
- 使用PHP把HTML生成PDF文件的几个开源项目介绍