php 继承中未预料到的行为和上下文



>我在PHP中遇到了一些非常奇怪的行为。我不知道这是否发生在所有其他 oop 语言中,所以这是一个额外的问题 - 是吗?好的,据我所知:

  1. 当你从基类继承一些东西时,你基本上复制 - 将受保护和公共方法粘贴到子类而不是私有类中。
  2. 您无权访问课程私有成员。
  3. 当调用具体实例的方法
  4. 时,你应该在实例上下文中调用该方法,就好像它是他自己的类的方法一样,其中$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()的方法,所以它也有效。

最新更新