是否可以使用关联数组声明常量

5

我正在尝试使用关联数组为我们各个国家的办公室名称声明常量。

我的声明代码如下:

define( "OUR_OFFICE", [
    "Japan" => "Tokyo Shibuya Office",
    "Taiwan" => "Taipei Shilin Office",
    "Korea" => "Seoul Yongsan Office",
    "Singapore" => "Singapore Novena Office",
    "Australia" => "Sydney Darlinghurst Office"
]);

然而,它只显示以下信息:
警告:常量只能计算标量值。
是否可以使用关联数组声明常量?
非常感谢!

1
“常量只能计算标量值”这个描述本身就很清楚了吧?为什么你需要它呢?你可以使用类常量代替。 - Mike Doe
简短的回答:不,这是不可能的。 - arkascha
@arkascha 感谢您的回复。但是我举的例子和 PHP.NET 上这个例子有什么区别吗?http://php.net/manual/en/function.define.php#120902 我只是想做像这个例子一样的事情。 - Ed Chen
2
{btsdaf} - Stephen R
2个回答

13

你贴出来的代码在 PHP 5 上无法工作。

使用define声明常量数组是 PHP 7.0 中引入的新功能之一

PHP 5.6起,可以使用const关键字定义一个常量数组

const OUR_OFFICE = [
    "Japan"     => "Tokyo Shibuya Office",
    "Taiwan"    => "Taipei Shilin Office",
    "Korea"     => "Seoul Yongsan Office",
    "Singapore" => "Singapore Novena Office",
    "Australia" => "Sydney Darlinghurst Office",
];

文档中强调了使用 define()const 定义常量的区别:

与使用 define() 定义常量不同,使用 const 关键字定义的常量必须在顶层作用域中声明,因为它们是在编译时定义的。这意味着它们不能在函数、循环、if语句或try/catch块中声明。


这要容易得多。非常感谢! - Ed Chen
1
有人能指出确切的文档证明你可以像上面的示例那样使用关联数组吗?对我来说无效,而且我找不到其他关于这种用法的参考。 - Stephen R
1
{btsdaf} - axiac
由于某种原因,只有在使用define()时它才能正常工作,否则会出现问题。谢谢。 - Stephen R
{btsdaf} - Stephen R
1
{btsdaf} - axiac

3

PHP 7 中也可以接受数组值。

但在 PHP 7 之前,您可能需要使用 define 来传递一个数组:

$array = [
    "Japan" => "Tokyo Shibuya Office",
    "Taiwan" => "Taipei Shilin Office",
    "Korea" => "Seoul Yongsan Office",
    "Singapore" => "Singapore Novena Office",
    "Australia" => "Sydney Darlinghurst Office"
];

$define_array = serialize($array);

define( "OUROFFICE", $define_array );

$our_office = unserialize(OUROFFICE);

print_r($our_office);

我明白了~~~~~ 我最好更新我的PHP...非常感谢! - Ed Chen
1
我有什么遗漏吗?我不明白为什么这个答案会有赞!这个解决方案与PHP7有什么关系?使用serialize/unserialize非常不方便。为什么不直接用一个不寻常的变量名(你知道永远不会被覆盖)保存整个东西并从文件中包含它呢?顺便说一句,这个解决方案适用于任何版本的PHP,但我不建议使用。人们无法记住哪些常量需要unserialize,哪些不需要(当然,你可以将所有常量保存为序列化字符串,但这真的值得吗?编写一个类更好)。 - Fr0zenFyr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接