首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PHP不能有一个常量对象?

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

Stack Overflow用户
提问于 2016-09-22 22:05:50
回答 1查看 12.2K关注 0票数 16

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

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

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

代码语言:javascript
复制
define('MySettings', array(
    'title' => 'My title'
    // etc
));

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

它工作得很好。

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

代码语言:javascript
复制
define('MySettings', (object) array('title' => 'My title'));

所以我可以这样叫它:

代码语言:javascript
复制
echo MySettings->title;
// or
echo MySettings::title;

这只是因为我认为将其类型化为对象属性/常量($obj->key,$obj::key)比作为数组($array['key'])更快、更美观。

有什么原因这是不可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-22 22:17:24

对于PHP,所有对象都是可变的。由于常量不应在运行时更改,但对象可以更改,因此当前不支持对象常量。

在phpdoc about constants中,声明:

使用const关键字时,只有标量数据(布尔值、整数、浮点数和字符串)可以包含在PHP5.6之前的常量中。从PHP 5.6开始,可以将常量定义为标量表达式,也可以定义数组常量。可以将常量定义为资源,但应避免这样做,因为它可能会导致意外的结果。

然而,数组是不一致的,并且没有给出合理的理由来解释为什么允许使用数组常数。(我甚至认为这是一个糟糕的决定。)必须注意,array-constants是不可变的,因此尝试更改它们会导致致命错误,如php7中的以下代码所示:

代码语言:javascript
复制
<?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'];

抛出:

代码语言:javascript
复制
PHP Fatal error:  Cannot use temporary expression in write context
in ~/wtf.php on line 12

为什么不能用类似的错误来定义对象常量?人们不得不问那是什么力量。

我建议不要将数组和对象作为常量。而是创建一个不可变的对象,或者使用immutable collections。

由于您正在寻找特定的语法,因此已经有了class constants的概念。

代码语言:javascript
复制
<?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

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

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39641336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档