Инициализация объявлений свойств класса PHP с помощью простых выражений приводит к синтаксической ошибке - PullRequest
6 голосов
/ 24 апреля 2010

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

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

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

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

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

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

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

public $var = 4+1;

, что говорит о том, что это не ограничение языковой конструкции array ().

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

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

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

Ответы [ 3 ]

9 голосов
/ 24 апреля 2010

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

class User {
    const IS_ADMIN = 1;
    const IS_MODERATOR1 = 1 << 1; // Won't work
    const IS_MODERATOR2 = 0x02;   // works
}
7 голосов
/ 13 марта 2014

Это ограничение больше не существует с 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
6 голосов
/ 24 апреля 2010

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

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


Редактировать март 2014

похоже, что php теперь будет поддерживать Постоянные скалярные выражения в php 5.6:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...