【问题标题】:Alternative for define array php替代定义数组 php
【发布时间】:2013-10-26 23:29:14
【问题描述】:

我正在寻找 define('name', array) 的替代方案,因为在定义中使用数组会出现此错误:

常量只能计算为 ... 中的标量值

我提到的数组只包含字符串。

【问题讨论】:

  • array 是什么?必须是The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values.
  • 这种方法值得一个用例。你为什么想做这个?定义是通常用于配置之类的全局符号。有更好的方法,例如依赖注入。

标签: php arrays constants global scalar


【解决方案1】:

来自 php.net...

常量的值;只有 标量和空值是 允许。标量值是整数、浮点数、字符串或布尔值。 可以定义资源常量,但不是 推荐并可能导致不可预知的行为。

但是你可以用一些技巧来做:

define('names', serialize(array('John', 'James' ...)));

& 使用时必须使用 unserialize() 常量值(名称)。这并不是那么有用,所以只需定义多个常量即可:

define('NAME1', 'John');
define('NAME2', 'James');
..

然后像这样打印:

echo constant('NAME'.$digit);

【讨论】:

    【解决方案2】:

    这在较新版本的 PHP 中发生了变化,如 stated in the PHP manual

    从 PHP 5.6 起,可以将常量定义为标量表达式,也可以定义数组常量

    【讨论】:

      【解决方案3】:

      如果你在php5.6 并且你知道这个版本以后的php确实支持数组作为常量。但是您仍然收到以下警告...

      Warning: Constants may only evaluate to scalar values
      

      那么你很幸运。因为使用define()定义数组常量的方法这个版本还没有介绍,只在phpv7.xx里面介绍了

      因此,您可以使用 const 关键字。

      const MY_SUPER_CONSTANT = array(
          'cool_key'      => 'Cool Value',
          'ultra_fab_key' => 'Fabulous Value',
      );
      

      【讨论】:

      • 这对我来说太棒了。谢谢
      【解决方案4】:

      Define 只适用于定义常量; The manual 状态:

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

      这就是数组不起作用的原因。

      那么对于一个常量数组,你可以考虑构建一个包含这些常量的类,并且可以基于数组类型调用返回它们?

      【讨论】:

        【解决方案5】:

        您可以使用json_encode函数将数组编码为json字符串并将其定义为常量,以便在可以访问该常量的任何地方使用。

        例子:

        // Define the array
        
        $MyArray = array(
            "mykey"  => "myvalue",
            "mykey1" => "myvalue1"
        );
        define('MYARRAY', json_encode($MyArray));
        
        // Decode the constant and use.
        $UseMyArray = json_decode(MYARRAY);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          相关资源
          最近更新 更多