php - 覆盖 PHP OOP 中的方法
问题描述
我不明白为什么要打印 // Bar::testPrivate 和 // Foo::testPublic .... "$this" 有优先权吗?我了解 Foo::testPublic 但 Bar::testPrivate 不要 在此处输入图像描述
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
?>
解决方案
尽管Foo
extends Bar
and是这里的and$myFoo
的一个实例;是的一部分,并且在其中,因此无法从. 由于它不可访问,因此它在本地执行.Foo
$this
$myFoo
test()
Bar
testPrivate()
private
Foo
Bar
Bar
请参阅PHP:可见性。页面中有一条评论,您在其中举例回答了您的问题。
该手册说“Private 仅将可见性限制为定义该项目的类”。这意味着扩展的子类看不到父类的私有方法,反之亦然。
因此,父母和孩子可以对“相同”的私有方法有不同的实现,这取决于你在哪里调用它们(例如,父类或子类实例)。为什么?因为私有方法只对定义它们的类可见,而子类看不到父类的私有方法。如果孩子看不到父母的私有方法,孩子就不能覆盖它们。范围不同。换句话说——每个类都有一组私有变量,其他人无法访问。
推荐阅读
- python - Selenium 在执行一段时间后为所有网站提供“超时接收来自渲染器的消息”
- css - 如何在css中的导航栏上应用模糊效果
- javascript - 如何删除一个div并将其粘贴到另一个div
- python - Python Mysql 连接器在 bytearray 中提供输出
- javascript - 如何仅在打印时设置相对于另一个 div 的 div 位置
- python - Selenium:计算具有相同名称的类
- php - Yii2 扩展和字段不与 ActiveDataProvider 一起使用
- wordpress - 更改本地 URL 后无法访问 Wordress 主页
- php - PHP DOM 获取表之间的 HREF 属性
- powershell - 使用文件夹中的 powershell 脚本获取某些文件名