【问题标题】:Initialising a static variable in PHP在 PHP 中初始化一个静态变量
【发布时间】:2015-02-08 12:49:52
【问题描述】:

取自PHP manual

与任何其他 PHP 静态变量一样,静态属性只能是 使用文字或常量初始化;不允许表达。 因此,虽然您可以将静态属性初始化为整数或数组 (例如),你不能将它初始化为另一个变量, 函数的返回值,或者一个对象。

所以这意味着我不能执行以下操作,因为 a) 不允许使用表达式,b) 不允许使用函数返回值。

class MyClass {
    // I can't do this.
    public static $var = 10 * 2;

    // I can't do this.
    public static $sum = array_sum( array( 3, 5, 6 ) );
}

但是,关于b) 不允许函数返回值,那么当array() 是一个有返回值的函数时,为什么可以执行以下操作?

class MyClass {
    // I can do this.
    public static $array = array( 3, 5, 6 );
}

【问题讨论】:

  • 这不是函数,而是语言结构。

标签: php


【解决方案1】:

array() 不是一个函数,它是一个初始化器。与普通函数不同,它是在编译时解释的,因此可以用来初始化一个静态的。

作为参考,这是static关键字后面允许的:

static_scalar_value:
    common_scalar  (e.g. 42)
    static_class_name_scalar (Foo::class)
    namespace_name      (Foo)
    T_NAMESPACE T_NS_SEPARATOR namespace_name (namespace \Foo)
    T_NS_SEPARATOR namespace_name (\Foo)
    T_ARRAY '(' static_array_pair_list ')' e.g. array(1,2,3)
    '[' static_array_pair_list ']' e.g. [1,2,3]
    static_class_constant e.g. Foo::bar
    T_CLASS_C (__CLASS__)

http://lxr.php.net/xref/PHP_5_5/Zend/zend_language_parser.y#945

Php 5.6 将“静态操作”添加到此列表中,这使得可以使用静态表达式,只要这些最终解析为静态标量。

class X {
    static $foo = 11 + (22/11); // syntax error in 5.5, valid in 5.6
}

【讨论】:

    【解决方案2】:

    一个好问题!简单的 ansvar 是 array() 只是 看起来 像一个函数,但实际上不是一个。

    来自the PHP documentation

    注意: array() 是一种语言结构,用于表示文字数组,而不是常规函数。

    【讨论】:

      【解决方案3】:

      因为数组不是函数。

      虽然array(1,2) 看起来您正在调用一个名为数组的函数,但您并没有做任何事情。您只是在创建一个数组,它 不是 一个函数调用。它更接近于说$a = 1

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
      • 嗯,我仍然认为这是问题的答案
      • 虽然多一点解释会很好,但我确实有点同意它正在走向一个答案。也许混淆来自array(1,2) 可能看起来有点像函数调用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2017-05-13
      • 2011-08-22
      • 2010-12-22
      • 1970-01-01
      • 2011-01-04
      • 2010-12-11
      相关资源
      最近更新 更多