你可以稍微修改一下第二种方法。在中定义可访问的密钥
$data
,并检查是否存在
__set()
就像你已经在做了一样
__get()
.
class Entity2
{
private $privateObject1, $privateObject2;
private $data = [
'accessible1' => null,
'accessible2' => null
];
public function __construct($injectedObject1, $injectedObject2)
{
$this->privateObject1 = $injectedObject1;
$this->privateObject2 = $injectedObject2;
}
public function __set($property, $value)
{
if (array_key_exists($property, $this->data)) {
$this->data[$property] = $value;
} else throw new \Exception("Property '$property' does not exist");
}
public function __get($property)
{
if (array_key_exists($property, $this->data)) {
return $this->data[$property];
} else throw new \Exception("Property '$property' does not exist");
}
}
不过,我并不真正相信在php中严格避免公共属性。如果它们无论如何都可以通过magic方法公开访问,我宁愿将它们声明为public,以便更清楚地说明类是如何工作的。