不允许动态创建公共属性

时间:2017-03-18 17:45:44

标签: php oop php-7

让我们从简单的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)。

1 个答案:

答案 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;