Инициализация статической переменной в 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 (eg 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 ')' eg array(1,2,3) '[' static_array_pair_list ']' eg [1,2,3] static_class_constant eg 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 } 

Хороший вопрос! Простым ансваром является то, что array() выглядит только как функция, но на самом деле это не одно.

Из документации PHP :

Примечание. Array () – это языковая конструкция, используемая для представления массива literal, а не регулярная функция.

Потому что массив не является функцией.

Хотя array(1,2) выглядит так, будто вы вызываете функцию, называемую массивом, вы не делаете ничего подобного. Вы просто создаете массив, который не является вызовом функции. это ближе сказать $a = 1 .