在PHP中初始化静态变量


Initialising a static variable in PHP

摘自PHP手册:

与任何其他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 );
}

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
}

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

来自PHP文档:

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

因为数组不是函数。

虽然array(1,2)看起来像是在调用一个名为array的函数,但您没有执行任何排序。您只是在制作一个数组,它不是函数调用。它更接近于说CCD_ 6。