php 在定义为常量的类示例上为prop赋值时,“无法在写入上下文中使用临时表达式”

v1uwarro  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(130)

下面的代码片段将在PHP 8.2上产生错误:

<?php

const foo = new stdClass();

foo->bar = 'baz';

echo foo->bar;

?>

我希望不会发生错误,因为我是在给prop赋值,而不是试图重新给常量赋值。
如果我创建一个新类,扩展stdClass,并添加以下方法:

class extendsStdClass extends stdClass {
    public function set(string $name, mixed $value) {
      $this->$name = $value;
    }
}

然后我可以使用以下语法将其赋值给props:

<?php

const foo = new extendsStdClass();

foo->set('bar', 'baz');

echo foo->bar;

?>

但是,剥绒机不会识别以这种方式设置的 prop ,也不会提供任何类型提示:

Undefined property: extendsStdClass::$bar

是否有什么原因导致我们无法在定义为常量的类示例上写入props?

q3qa4bjr

q3qa4bjr1#

我希望能够在命名空间中定义此常量,并通过以下方式访问/修改它
如果你想修改它,* 那么它不是一个常量 *。
如果你真的想要一个常量,那么你可以使用一个数组来获取键/值对:

namespace MyNamespace {
    const FOO = [
        'one' => 1,
        'two' => 2,
    ];
}

然后通过以下方式在任何位置引用:

print_r(\MyNamespace\FOO);

产量:

Array
(
    [one] => 1
    [two] => 2
)

你可以用数组符号取出一个值:

echo \MyNamespace\FOO['one'];

如果你想通过命名空间直接引用某个东西,并且仍然可以修改,你可以创建一个静态存储的类,有点像半吊子的单例:

namespace MyNamespace;

class Foo
{
    private static array $data = [];
    public static function get($name)
    {
        return self::$data[$name] ?? null;
    }
    public static function set($name, $value)
    {
        self::$data[$name] = $value;
    }
}

然后,您可以从任何位置设置值:

\MyNamespace\Foo::set('one', 1);

并从任何地方获取值:

echo \MyNamespace\Foo::get('one');

相关问题