如果我有一个返回对不可见(私有或受保护)属性的引用的公共类方法,我可以使用该引用来获得直接访问:
PHP代码
class A
{
private $property = 'orange';
public function &ExposeProperty()
{
return $this->property;
}
public function Output()
{
echo $this->property;
}
}
$obj = new A();
# prints 'orange'
$obj->Output();
$var = &$obj->ExposeProperty();
$var = 'apple';
# prints 'apple'
$obj->Output();
PHP中有这个功能的原因吗?或者它只是一个设计疏忽,无法通过引用跟踪访问冲突?
当你想要实现以下目标时,它显然会派上用场:
PHP代码
$this->load->resource();
其中load
是修改$this
的给定属性的对象。但除了这条捷径之外,我没有看到许多可能的用途,否则这些用途对于有效的OOP模式是不可能的。
答案 0 :(得分:2)
好吧, 显式返回对值的引用。您正在锁定前门,但随后打开侧门。你 非常故意瞄准并射击自己的脚。如果$property
是一个对象,并且您使用或不使用&
引用返回此对象,则对此对象的任何修改也会反映在$property
上。这就是引用的工作原理,它总是修改引用指向的唯一现有值。
可见性修饰符不是魔术般的铁质"保护"。有多种方法可以规避private
可见性以访问和修改属性。它们主要作为自己和其他开发人员的标志,不应该直接访问此属性,它是供内部使用的,而不是公开认可的API。并且PHP会打耳光如果你忘了那个,你就在手腕上。没什么,没什么。
此外,这里没有任何事实被侵犯。外部代码无法访问或修改$obj->property
。这是private
应该禁止的唯一事情。您实际上在对象上公开了一个修改private
属性的公共API。通常这是通过getter和setter函数完成的,但是by-reference API显然也能正常工作。