我在PHP中遇到了一些奇怪的奇怪行为。我不知道这是否发生在所有其他oop语言中,所以这是奖金问题 - 是吗?好吧,据我的知识告诉我:
就我在普通PHP中的测试而言,这不是真的,而且我完全精神错乱。任何人都可以解释这种奇怪的(对我来说)行为吗?
以下是测试代码:
<?php
class A {
private function foo() {
echo "Here are the private stuff that only A class knows about..." . '</br>';
echo "The class name of this function is" . __CLASS__ . '</br>';
}
public function test() {
$this->foo();
}
}
class B extends A {
}
class C extends A {
private function foo() {
}
}
$a = new A();
$a->test();
$b = new B();
$b->test();
$c = new C();
$c->test();
$reflectionA = new ReflectionClass($a);
$reflectionB = new ReflectionClass($b);
$reflectionC = new ReflectionClass($c);
var_dump($reflectionA->getMethods());
var_dump($reflectionB->getMethods());
var_dump($reflectionC->getMethods());
var_dump($reflectionB->hasMethod('foo'));
答案 0 :(得分:0)
好吧,B扩展A并接收其所有方法,而不是像你所说的那样“复制”,但是接收那些非私有的访问权限。它没有自己的私有foo()
,但它有父级的测试,当你打电话
$b->test();
php理解,你在搜索什么,检查,B中是否有任何test()
方法 - 没有,所以它测试,A中是否存在 - 并且发现并使用它。由于A具有私有foo()
,并且由A的方法test()
调用 - 它也有效。
对于C,情况是相同的,除了它有自己的私有方法。但是A的方法foo()
正在A类中寻找方法foo()
,所以它也有效。