为什么PHP不能有一个常量对象?

2022-08-31 00:57:59

我有一个键值数据库表,在其中存储一些设置。

我想将这些设置放在PHP常量对象中,因为它们不应该是可编辑的。

在 PHP7 中,我们现在可以这样做:

define('MySettings', array(
    'title' => 'My title'
    // etc
));

// And call it with
echo MySettings['title'];

而且效果很好。

但是为什么我不能这样做:

define('MySettings', (object) array('title' => 'My title'));

所以我可以这样称呼它:

echo MySettings->title;
// or
echo MySettings::title;

这只是因为我认为将其键入为对象属性/常量(,)比作为数组($obj->key$obj::key$array['key'])

有什么理由这是不可能的吗?


答案 1

对于 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

也可以在接口中定义它们。


答案 2

推荐