让我们从简单的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)。
答案 0 :(得分:1)
<?php
ini_set("display_errors", 1);
class Test
{
protected $name="ss";
public function __set($property, $value)
{
//Checked for undefined properties
if(!isset(get_object_vars($this)[$property]))
{
throw new Exception("Property {$property} does not exit");
}
//Checking for public properties
$prop = new ReflectionProperty($this, "name");
if(!$prop->isPublic())
{
throw new Exception("Property {$property} does not exit");
}
//Checking for non-existing properties
if (!property_exists($this, $property))
{
throw new Exception("Property {$property} does not exit");
}
$this->$property = $value;
}
}
$test = new Test();
$test->x = 20;
echo $test->x;