Инициализация объявлений свойств класса PHP с помощью простых выражений дает синтаксическую ошибку

Согласно документам PHP, можно инициализировать свойства в классах со следующим ограничением:

«Это объявление может включать инициализацию, но эта инициализация должна быть постоянным значением, то есть она должна быть способна быть оценена во время компиляции и не должна зависеть от информации о времени выполнения для оценки».

Я пытаюсь инициализировать массив и иметь некоторые проблемы. Хотя это прекрасно работает:

public $var = array( 1 => 4, 2 => 5, ); 

Это создает синтаксическую ошибку:

 public $var = array( 1 => 4, 2 => (4+1), ); 

Даже это не принято:

 public $var = 4+1; 

что предполагает, что это не ограничение конструкции языка array ().

Теперь, в последний раз, когда я проверил, «4 + 1» приравнивается к постоянному значению, которое не только должно быть принято, но должно быть фактически оптимизировано. В любом случае, это, безусловно, может быть оценено во время компиляции.

Так что здесь происходит? Является ли ограничение действительно по строкам «не может быть никаким вычисленным выражением вообще», по сравнению с любым выражением «может быть оценено во время компиляции»? Использование «оцененных» на языке документа предполагает, что простые вычисления разрешены, но, увы …

Если это ошибка в PHP, есть ли у кого-нибудь идентификатор ошибки? Я попытался найти его, но ему не повезло.

Solutions Collecting From Web of "Инициализация объявлений свойств класса PHP с помощью простых выражений дает синтаксическую ошибку"

PHP не выполняет такие операции во время компиляции; вы не можете присваивать вычисляемые значения константам, даже если все операторы являются самими константами. Значения по умолчанию для членов класса обрабатываются точно так же. Я столкнулся с этим поведением, поскольку я пытался назначить полномочия двух констант:

 class User { const IS_ADMIN = 1; const IS_MODERATOR1 = 1 << 1; // Won't work const IS_MODERATOR2 = 0x02; // works } 

Это ограничение больше не существует с PHP 5.6

Новая функция, которая разрешает ранее запрещенный синтаксис, называется постоянными скалярными выражениями :

Теперь можно предоставить скалярное выражение, включающее числовые и строковые литералы и / или константы в контекстах, в которых PHP ранее ожидал статического значения, например константы и объявления свойств и аргументы функции по умолчанию.

 class C { const THREE = TWO + 1; const ONE_THIRD = ONE / self::THREE; const SENTENCE = 'The value of THREE is '.self::THREE; public function f($a = ONE + self::THREE) { return $a; } } echo (new C)->f()."\n"; echo C::SENTENCE; ?> 

Вышеприведенный пример выводит:

 4 The value of THREE is 3 

Прежде чем бросить свои руки на php для этого, подумайте о модели исполнения. В среде, в которой php обычно используется (и, фактически, предназначен для), все создается, выполняется, а затем выбрасывается … до следующего входящего HTTP-запроса. Это не имеет большого смысла чтобы тратить время на выполнение вычислений во время фазы синтаксического анализа / компиляции. В общем случае двигатель должен быть очень быстрым.

Но, вы правы, эта цитата из руководства действительно говорит «оценить». Возможно, вам стоит открыть билет на документацию.


Изменить марш 2014

похоже, что php теперь будет поддерживать Constal Scalar Expressions в php 5.6: