PHP 变量覆盖

2022-08-30 17:45:59

当我尝试重写类变量时,与在PHP中重写类方法的方式相同。喜欢:

class DataMapper {
     protected $_name = null;

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

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

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

它是印刷的“安娜”。

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


答案 1

事实并非如此。这就是PHP应该如何工作。看看 PHP 类和对象可见性

相同类型的对象将有权访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象中时,特定于实现的详细信息已经知道。

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


答案 2

我认为你只是很难理解$this做了什么。引用$this时,它实际上是在引用当前对象。

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

由于 Model 对象的 $_name 属性被实例化为“Ana”,因此它正在打印 Ana。这正是人们所期望的。也许再读一遍遗传和范围理论会帮助你理解这里发生了什么。


推荐