示例代码
class Example {
protected $data = 'data ';
public function getData() {
return $this->data;
}
public function mergeWith(Example $e) {
$this->data .= $e->data;
}
}
$e1 = new Example();
$e2 = new Example();
$e1->mergeWith($e2);
结果是
Example Object
(
[data:protected] => data data
)
我的问题是 - 为什么我能够从对象外部访问对象的受保护/私有属性?它是同一个类,但它是一个不同的实例,不应该算作外部呼叫吗?这背后的想法是什么?
答案 0 :(得分:1)
可见性是根据类层次结构定义的,而不是实例。因此protected
被同一层次结构的所有实例访问。因此instaceof Example
的任何对象都可以访问它。
在实现类似对象模型的几乎所有其他(?)编程语言中,它的工作方式相同。刚出头:C ++(有一些例外,但一般来说它仍适用于此),C#,Java。