我有一个键值数据库表,我存储了一些设置。
我希望将这些设置放在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']
)更快更漂亮
有什么理由不可能吗?
答案 0 :(得分:15)
对于PHP,所有对象都是可变的。由于常量永远不会在运行时更改但对象可以,因此目前不支持对象常量。
在phpdoc about constants中,声明:
使用const关键字时,只有标量数据(布尔值,整数, 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'];
投掷:
PHP Fatal error: Cannot use temporary expression in write context
in ~/wtf.php on line 12
为什么无法定义具有类似错误的对象常量?人们不得不问这种力量。
我建议远离数组和对象作为常量。而是创建一个不可变对象或改为使用immutable collections。
由于您正在寻找某种语法,因此已有class constants的概念。
<?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
也可以在界面中定义它们。