PHP 只读属性?

2022-08-30 09:21:06

在使用PHP的DOM类(DOMNode,DOMEElement等)时,我注意到它们具有真正的只读属性。例如,我可以读取DOMNode的$nodeName属性,但我不能写入它(如果我这样做,PHP会抛出致命错误)。

如何在 PHP 中创建自己的只读属性?


答案 1

你可以这样做:

class Example {
    private $__readOnly = 'hello world';
    function __get($name) {
        if($name === 'readOnly')
            return $this->__readOnly;
        user_error("Invalid property: " . __CLASS__ . "->$name");
    }
    function __set($name, $value) {
        user_error("Can't set property: " . __CLASS__ . "->$name");
    }
}

仅在您真正需要时才使用它 - 它比正常的属性访问慢。对于 PHP,最好采用仅使用 setter 方法从外部更改属性的策略。


答案 2

从 PHP 8.1 开始,有实现的本机只读属性

文档

在声明属性期间,只能初始化一次只读属性。

class Test {
    public readonly string $prop;

    public function __construct(string $prop) {
        $this->prop = $prop;
    }
}

--

class Test {
    public function __construct(
        public readonly string $prop,
    ) {}
}

尝试修改只读属性将导致以下错误:

Error: Cannot modify readonly property Test::$prop

推荐