不应该这个引用当前对象吗?

时间:2017-02-26 20:13:22

标签: php oop

我正在学习自我,静态与此之间的差异,并在php.net中遇到了这个例子:

<?php
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails
?>

结果是

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

我的问题是:在创建新对象C时,不应该调用$this->foo();调用C类中新替换的私有函数foo(并返回错误,因为它是私有的) ?

1 个答案:

答案 0 :(得分:1)

您应该使用protected而不是public来获取此行为。

这里详细介绍了这一点:What is the difference between public, private, and protected?

快速摘录:

  
      
  • 公共范围,使该变量/函数可以从对象的任何地方,其他类和实例中获得。
  •   
  • 私有范围,当您希望变量/函数仅在其自己的类中可见时。
  •   
  • 当您希望在扩展当前类(包括父类)的所有类中显示变量/函数时,
  • 受保护的范围。
  •