对于 PHP,所有对象都是可变的。由于常量在运行时不应更改,但对象可以更改,因此当前不支持对象常量。
在关于常量的 phpdoc 中,它指出:
使用 const 关键字时,PHP 5.6 之前的常量中只能包含标量数据(布尔值、整数、浮点数和字符串)。从 PHP 5.6 开始,可以将常量定义为标量表达式,也可以定义数组常量。可以将常量定义为资源,但应避免使用,因为它可能会导致意外结果。
但是,数组存在不一致,并且没有给出为什么允许数组常量的合理性。(我甚至认为这是一个糟糕的电话。必须注意的是,它是不可变的,因此尝试更改它们会导致致命错误,如php7中的以下代码所示:array-constants
<?php
$aNormalMutableArray = ['key' => 'original'];
$aNormalMutableArray['key'] = 'changed';
echo $aNormalMutableArray['key'];
define(
'IMMUTABLE_ARRAY',
[
'key' => 'original',
]
);
IMMUTABLE_ARRAY['key'] = 'if I am an array, I change; if I am a constant I throw an error';
echo IMMUTABLE_ARRAY['key'];
扔:
PHP Fatal error: Cannot use temporary expression in write context
in ~/wtf.php on line 12
为什么不能定义具有类似错误的对象常量?人们必须问问当时的力量。
我建议远离数组和对象作为常量。而是创建一个不可变的对象或改用不可变集合。
由于您正在寻找某种语法,因此已经存在类常量的概念。
<?php
class MyClass
{
const CONSTANT = 'constant value';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n"; // As of PHP 5.3.0
也可以在接口中定义它们。