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

标签 php immutability

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

最佳答案

您应该使用 __set__get 魔术方法并将该属性声明为 protected 或私有(private):

/**
 * @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
    }
}

示例:

$example = new Example();
var_dump($example->value);
$example->value = "invalid";
var_dump($example->value);

Outputs:

string(4) "test"
string(4) "test"

@property-read应该可以帮助您的 IDE 承认这个神奇属性的存在。

关于PHP:不可变的公共(public)成员字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7317037/

相关文章:

php - 从数据库中获取并分离单列数据

java - Spring DAO 和不可变对象(immutable对象)

c# - 添加到可变类型,就好像它是不可变的(无序)

javascript - PHP 相当于 JavaScript 的parentNode 属性

php - 从父项中获取过滤后的子项

java - 由于不变性,字符串线程安全?

c# - 字符串不变性在向开发人员解释字符串引用时扮演什么角色?

javascript - 我是否必须忽略 Immutable JS 的全局模块状态的概念?

php - 如何比较两个字符串 [已] , [已] 并查看彼此有多接近?使用 PHP

php - 使用PDO时如何获取原始表/列名?