如果我有一个返回对不可见(私有或受保护)属性的引用的公共类方法,我可以使用该引用来获得直接访问权限:
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 模式是不可能的。
好吧,您显式返回对值的引用。您正在锁定前门,但随后打开了一个侧门。你非常刻意地瞄准并在这里射击自己的脚。如果$property
是一个对象,并且您返回此对象时有或没有&
引用,则对此对象的任何修改也将反映在$property
上。这就是引用的工作方式,它总是修改引用指向的唯一现有值。
可见性修改器不是神奇的铁包"保护"。有多种方法可以绕过private
可见性来访问和修改属性。它们主要是为了向您自己和其他开发人员展示不应直接访问此属性,它仅供内部使用,而不是公开批准的 API。如果你忘记了这一点,PHP 会拍打你的手腕。仅此而已,仅此而已。
此外,这里没有真正违反任何内容。外部代码在任何时候都不会访问或修改$obj->property
。这是private
唯一应该禁止的事情。您实际上是在对象上公开一个公共 API,该 API 修改了 private
属性。通常这是通过 getter 和 setter 函数完成的,但按引用 API 显然也可以工作。