当我尝试覆盖类变量时,覆盖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可以做这样的事情?它打破了面向对象范式的规律
答案 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()。所以当你调用函数时,它就像属于模型类的函数一样。