是否可以将数组声明为常量

mrN*_*mrN 56 php

我们可以定义一个常量

define("aconstant','avalue');
Run Code Online (Sandbox Code Playgroud)

我们不能像下面这样定义数组吗?

define("months",array("January", "February", ---); 
Run Code Online (Sandbox Code Playgroud)

mas*_*tic 78

自PHP 5.6(通过nikic)以来,您可以将const用于此目的.

const months = ["January", "February"];
var_dump("January" === months[0]);
Run Code Online (Sandbox Code Playgroud)


Dej*_*vic 59

更新:这在PHP 7中是可能的(参考)

// Works as of PHP 7
define('ANIMALS', array(
    'dog',
    'cat',
    'bird'
));
echo ANIMALS[1]; // outputs "cat"
Run Code Online (Sandbox Code Playgroud)

原始答案

来自php.net ...

常数的值; 只允许标量和空值.标量值是整数,浮点数,字符串或布尔值.可以定义资源常量,但不建议这样做,并且可能导致不可预测的行为.

$months = array("January,"February",...) 会没事的.

  • 如果有人没有注意到其他答案,你可以在PHP 5.6或更新版本中创建一个"const"数组. (2认同)
  • 为了清楚起见,PHP 7的介绍也包括关联数组.`define('MY_ANIMALS',array('dog'=>'Ottie','cat'=>'加菲猫','bird'=>'Tweetie')); echo MY_ANIMALS ['cat']; //输出'加菲猫' (2认同)

Sim*_*Sim 29

您可以使用hack将数组放在常量中:

define('MONTHS', serialize(array('January', 'February' ...)));
Run Code Online (Sandbox Code Playgroud)

但是unserialize()在需要的时候你必须得到那个恒定的值,我想这不是那么有用.

作为替代方案,定义多个常量:

define('MONTH_1', 'January');
define('MONTH_2', 'February');
...
Run Code Online (Sandbox Code Playgroud)

并使用constant()函数查找值:

echo constant('MONTH_'.$month);
Run Code Online (Sandbox Code Playgroud)

  • @CengizFrostclaw:在大多数情况下,`serialize`会更好.即使它最终变得有点慢(我猜这与事实相反),它本身也支持PHP概念,如引用和类型化对象,这些概念无法通过JSON进行往返. (4认同)
  • +1,但我想知道,json_encode和json_decode怎么样?哪一个更适合记忆和表现? (3认同)
  • @MarioAwad:我们不应该习惯盲目使用"最不危险"的方法; 那种方式就是货运崇拜.我们应该习惯*评估危险*.坦率地说,对于纯粹的内部事物,与用户输入相关的安全风险根本不存在.更大的危险是你得到的东西可能不是你输入的东西,而JSON有时会非常糟糕.(尝试`json_encode`任何引用它自己的东西.)我将在这种情况下批准`explode`会更简单.但JSON是过度的(并且代码方面,允许传入非预期的数据结构). (2认同)

Den*_*ink 11

不,你不能.请参阅PHP:语法 - 手动

标量数据(布尔,整数,浮点)可被包含在常量.可以将常量定义为资源,但应该避免,因为它可能会导致意外结果.


Exi*_*196 9

您可以使用JSON格式将数组保存在字符串中,然后将此字符串指定为常量.

$months = array("January","February","March");
define('MONTHS', json_encode($months));
Run Code Online (Sandbox Code Playgroud)

当你想使用它时:

$months = json_decode(MONTHS);
Run Code Online (Sandbox Code Playgroud)


Mar*_*rro 6

如果你必须有一个常量,那么如何使用一个分隔的字符串并爆炸成一个数组呢?

define("MONTHS", "January;February;March");
$months = explode(";",MONTHS);
Run Code Online (Sandbox Code Playgroud)

  • 我想这需要一个大阵列才能真正产生显着差异. (2认同)

jfm*_*cer 6

从PHP 5.6开始,可以声明常量数组.链接的文档使用该示例const ARR = ['a', 'b'];.你也可以这样做const ARR = array('a', 'b');.但是,在5.6中有一个奇怪的怪癖:你可以使用const但不能声明常量数组define().这在PHP 7.0中得到纠正.