php继承中不受欢迎的行为和上下文

时间:2016-03-06 11:59:01

标签: php oop inheritance

我在PHP中遇到了一些奇怪的奇怪行为。我不知道这是否发生在所有其他oop语言中,所以这是奖金问题 - 是吗?好吧,据我的知识告诉我:

  1. 当您从基类继承某些东西时,您基本上复制 - 将protected和public方法粘贴到子类而不是私有。
  2. 您无法访问班级私人会员。
  3. 当调用具体实例的方法时,你应该在实例上下文中调用该方法,就好像它是他自己的类的自己的方法,其中$ this指向调用该方法的对象(类的实例)
  4. 就我在普通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'));
    

1 个答案:

答案 0 :(得分:0)

好吧,B扩展A并接收其所有方法,而不是像你所说的那样“复制”,但是接收那些非私有的访问权限。它没有自己的私有foo(),但它有父级的测试,当你打电话

$b->test();

php理解,你在搜索什么,检查,B中是否有任何test()方法 - 没有,所以它测试,A中是否存在 - 并且发现并使用它。由于A具有私有foo(),并且由A的方法test()调用 - 它也有效。

对于C,情况是相同的,除了它有自己的私有方法。但是A的方法foo()正在A类中寻找方法foo(),所以它也有效。