在PHP中初始化静态变量

时间:2015-02-08 12:49:53

标签: php

取自PHP manual

  

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

所以这意味着我不能做以下事情,因为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 );
}

3 个答案:

答案 0 :(得分:4)

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
}

答案 1 :(得分:2)

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

来自the PHP documentation

  

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

答案 2 :(得分:-1)

因为数组不是函数。

虽然array(1,2)看起来像是在调用一个名为array的函数,但是你没有进行任何排序。你只是创建一个数组,这是不是一个函数调用。它更接近于$a = 1