>我在PHP中遇到了一些非常奇怪的行为。我不知道这是否发生在所有其他 oop 语言中,所以这是一个额外的问题 - 是吗?好的,据我所知:
- 当你从基类继承一些东西时,你基本上复制 - 将受保护和公共方法粘贴到子类而不是私有类中。
- 您无权访问课程私有成员。 当调用具体实例的方法
- 时,你应该在实例上下文中调用该方法,就好像它是他自己的类的方法一样,其中$this指向调用该方法的对象(类的实例)。
就我在普通 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'));
好的,B 扩展 A 并接收其所有方法,而不是像您所说的"复制",而是接收对它们的访问权限,访问那些非私有的方法。它没有自己的私人foo()
,但它有父母的测试,当你打电话时
$b->test();
php 明白,你在搜索什么,检查,B 中是否有任何test()
方法 - 没有,所以它会测试,然后,A 中是否有 - 并找到并使用它。由于 A 具有私有foo()
,并且它由 A 的方法调用 test()
- 它也在工作。
至于C,情况是一样的,只是它有自己的私有方法。但是 A 的方法foo()
正在寻找 A 类中foo()
的方法,所以它也有效。