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

Jem*_*oeE 14 php constants object

我有一个键值数据库表,我存储了一些设置.

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

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

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

// And call it with
echo MySettings['title'];
Run Code Online (Sandbox Code Playgroud)

而且效果很好.

但为什么我不能这样做:

define('MySettings', (object) array('title' => 'My title'));
Run Code Online (Sandbox Code Playgroud)

所以我可以这样称呼它:

echo MySettings->title;
// or
echo MySettings::title;
Run Code Online (Sandbox Code Playgroud)

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

有什么理由不可能吗?

k0p*_*kus 16

对于PHP,所有对象都是可变的.由于常量永远不会在运行时更改但对象可以,因此目前不支持对象常量.

关于常量phpdoc中,声明:

使用const关键字时,只有标量数据(boolean,integer,float和string)可以包含在PHP 5.6之前的常量中.从PHP 5.6开始,可以将常量定义为标量表达式,也可以定义数组常量.可以将常量定义为资源,但应该避免,因为它可能会导致意外结果.

虽然数组与数组不一致,但没有理由说明为什么允许数组常量.(我甚至认为这是一个糟糕的调用.)必须注意的array-constants是,它是不可变的,因此尝试更改它们导致致命错误,如php7中此代码所示:

<?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'];
Run Code Online (Sandbox Code Playgroud)

投掷:

PHP Fatal error:  Cannot use temporary expression in write context
in ~/wtf.php on line 12
Run Code Online (Sandbox Code Playgroud)

为什么不能用类似的错误定义对象常量?人们必须要求权力.

我建议远离数组和对象作为常量.而是创建不可变对象或使用不可变集合.

由于您正在寻找某种语法,因此已经存在类常量的概念.

<?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
Run Code Online (Sandbox Code Playgroud)

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