php手动可见性示例
我对php手册中的一个示例感到困惑。这是关于能见度的。这是一个例子php手动可见性示例,php,visibility,Php,Visibility,我对php手册中的一个示例感到困惑。这是关于能见度的。这是一个例子 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPriv
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
请你解释一下这是怎么发生的
为什么不同时调用testPublic()
?
我在Bar类构造中放置了一个变量转储($this)
。它打印对象(Foo)[1]
。我知道私有属性可以用同一个类调用
那么“
Bar::testPrivate
”是如何调用的?Private
并不意味着您不能调用它。这意味着您只能从当前类调用它Public
意味着您可以从任何类调用它
要调用Bar::testPrivate
,请尝试以下操作:
$Bar->testPublic();
或
但是,您不能调用$Bar->testPrivate()
,因为该方法是private
那么如何调用“Bar::testPrivate”
调用$myFoo->test()
时,它会在Bar
的上下文中运行代码,因为Foo
类没有覆盖它
在Bar::test()
内部,当调用$this->testPrivate()
时,解释器将首先查看Foo
,但该方法是私有的(并且不能从Bar
调用子类的私有方法),因此它会上升一级,直到找到合适的方法;在本例中,这将是Bar::testPrivate()
相反,当调用$this->testPublic()
时,解释器会立即在Foo
中找到合适的方法并运行它
编辑
为什么两个testPublic()都不被调用
当您运行$this->testPublic()
时,只调用一个方法,这是距离基类最远的一个方法
如果
Foo::testPublic()
还需要执行父级的实现,则应在该方法内编写parent::testPublic()
。您的函数位于栏
类中,您正在使用神奇的$this
指针调用成员函数
尝试将函数test()
移动到Foo
类,看看会发生什么。输出应为:
Foo::testPrivate
Foo::testPublic
在您的示例中,调用了Bar的私有函数,因为它仅适用于该类。Foo类中没有test
函数,因此Bar
类中的test函数没有调用它们的权限
然后,由于函数重载,调用了类Foo
的公共函数而不是Bar
两个类都有一个同名函数,因此子类的函数很重要。您调用
$myFoo->test();
参见功能测试:
public function test() {
$this->testPrivate();
$this->testPublic();
}
当对Bar
类(包括继承的类)的实例调用此函数时,它将调用testPrivate
和testPublic
这些方法在类Foo
中被重写,这意味着使用Foo
的方法。始终可以调用基类的方法:
// in Foo
public function testPublic() {
parent::testPublic();
echo "Foo::testPublic\n";
}
之所以调用Bar::testPrivate
,是因为它是private
,并且未被Foo::testPrivate
覆盖
请参阅更多信息。类Foo扩展了类栏。然后调用函数测试,它在Bar中定义。在这个函数中有两个调用。一个是公共函数,一个是类栏中的私有函数。我猜用户“omega at 2093 dot es”(omega at 2093 dot es)的注释描述了同样的事情。
据说:“父类中定义的方法不能访问从它们继承的类中定义的私有方法。但是,它们可以访问受保护的方法。”
在您的例子中,Bar::test()
方法中的对象是Foo
类型(您的var\u转储证明了这一点)。因为Foo::testPrivate()
方法是私有的,所以不能从父类Bar访问它,唯一可以访问的方法仍然是Bar::testPrivate()
(尝试注释定义,您将得到致命错误)。这就是为什么第一个输出是Bar::testPrivate
行$this->testPublic()
调用Foo::testPublic()
方法,因为$this
属于Foo
类型,并且方法定义为public
简而言之,私有方法只能从定义它们的类访问。既不能从子类也不能从父类访问它们
要使该方法可从子类或父类访问,请使其受保护。例如,如果将testPrivate()
方法设置为在两个类中都受保护,它将打印Foo::testPrivate Foo::testPublic
,这并不能回答问题。抱歉,误解了问题。修正了。+1,为什么不能调用FootestPrivate()
?因为它是私有的,你不希望父母触碰他们孩子的隐私,是吗?我想,关于testPublic()
的部分困惑是,PHP进行替换覆盖而不是细化覆盖。这意味着PHP不会在子对象中调用父对象的方法,除非您明确要求它这样做(例如:parent::testPublic();
)。你解释得很好。现在我明白了。因为$this指的是foo,所以我认为应该调用foo类的私有函数。这是我弄糊涂的一点。
// in Foo
public function testPublic() {
parent::testPublic();
echo "Foo::testPublic\n";
}