PHP变量覆盖

时间:2011-06-14 04:42:37

标签: php override oop

当我尝试覆盖类变量时,覆盖PHP中的类方法。像:

class DataMapper {
     protected $_name = null;

     public function printName() {
          echo $this->_name;
     }
}

class Model extends DataMapper {
     protected $_name = 'Ana';
}

$test = new Model();
$test->printName();

打印'Ana'。

为什么PHP可以做这样的事情?它打破了面向对象范式的规律

3 个答案:

答案 0 :(得分:25)

不是。这就是PHP应该如何工作的方式。看看PHP Classes and Objects Visibility

  

相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是同一个实例。这是因为在这些对象内部已经知道实现特定的细节。

因为Model扩展了DataMapper,它可以访问它的函数,变量等,但它可以覆盖它们,这就是发生的事情。尽管您的函数存在于DataMapper类中,但它是从名称设置为Ana的Model类调用(并由其继承)。

答案 1 :(得分:4)

我认为你只是在理解这个$的作用。当你引用$ this时,它实际上是引用当前对象。

当您继承DataMapper类时,可以在Model对象中访问printName()方法,但是$ this引用仍然引用当前的Model对象$ test。

由于Model对象的$ _name属性被实例化为“Ana”,因此它正在打印Ana。这正是预期的结果。也许再读一遍继承和范围理论可以帮助你理解这里发生的事情。

答案 2 :(得分:3)

我不认为这违反了“OO法则”。您继承了DataMapper类。因此,您继承了public function printName()。所以当你调用函数时,它就像属于模型类的函数一样。

相关问题