让我们从简单的PHP代码开始:
<?php
class Test
{
}
$test = new Test();
$test->x = 20;
echo $test->x;
这里的问题是,这段代码可以正常运行(在PHP 7.1中测试过,可能在一些旧版本中也可以正常运行)。
我看到的问题是,使用这样的代码很容易编写出非常难以分析并可能包含一些隐藏错误的代码。
问题: 有没有办法防止在类外动态创建对象属性,特别是在类外部?
对于这样的自定义类,可以使用创建自定义__set
方法来创建未声明的属性,例如:
public function __set($property, $value)
{
if (!property_exists($this, $property)) {
throw new Exception("Property {$property} does not exit");
}
$this->$property = $value;
}
但它显然不能解决受保护/私有属性的问题 - property_exists()函数也会对受保护和私有属性返回true(需要使用Reflection来处理)。