PHP:不可变的公共成员字段

sna*_*ile 12 php immutability

我需要创建一个不可变的类,它只是一个成员字段容器.我希望它的字段在其构造函数中实例化一次(值应作为构造函数的参数给出).我希望这些字段是公开的但不可变的.我可以final在每个字段之前使用关键字用Java完成它.它是如何在PHP中完成的?

san*_*mai 17

您应该使用__set__get魔术方法并将该属性声明为受保护或私有:

/**
 * @property-read string $value
 */
class Example
{
    private $value;

    public function __construct()
    {
        $this->value = "test";
    }

    public function __get($key)
    {
        if (property_exists($this, $key)) {
            return $this->{$key};
        } else {
            return null; // or throw an exception
        }
    }

    public function __set($key, $value)
    {
        return; // or throw an exception
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

$example = new Example();
var_dump($example->value);
$example->value = "invalid";
var_dump($example->value);
Run Code Online (Sandbox Code Playgroud)

输出:

string(4) "test"
string(4) "test"
Run Code Online (Sandbox Code Playgroud)

@property-read 应该帮助你的IDE承认这个神奇属性的存在.