私有财产 - 面向对象的PHP

时间:2014-12-18 05:13:42

标签: oop private access-modifiers

我是面向对象编程的初学者。我对一个被声明为PRIVATE的变量感到困惑。

  <?php
   class dog {
        private $Name;
    }

    class poodle extends dog { 
        public function test($test){
            $this->Name = $test;
        }
    }

    $poppy = new poodle;
    $poppy->test("test");
    echo $poppy->Name;
?>

正如我所读到的,“私有变量只能由拥有它们的确切类访问 - 子类无法访问私有父函数变量”

我的问题是,如果$ Name是私有属性,为什么脚本的输出返回“test”?它不应该输出错误消息,因为另一个类正在尝试访问私有属性吗?

1 个答案:

答案 0 :(得分:1)

答案很简单。如果您在var_dump对象上执行$poppy输出,您会注意到无论如何它将输出test的原因。

object(poodle)[1]
  private 'Name' (dog) => null
  public 'Name' => string 'test' (length=4)

PHP是一种基于动态类型的语言,可以在运行时分配变量,而无需先声明空间。由于属性$Name不存在于对象poodle中(在类狗中,您声明它私有使其不可用于继承),因此它创建(声明)一个即时(默认情况下,不存在的变量变为 public )。

这给出了错觉,好像对象$Name的属性$dog确实已设置。