Почему невозможно использовать магические константы в статическом контексте? - PullRequest
3 голосов
/ 18 февраля 2012

Есть ли какая-либо конкретная причина, чтобы отрицать использование магических констант (таких как __DIR__) в PHP, когда они находятся в статическом контексте? ООП POV, кажется, ничего плохого, поскольку __DIR__ является "глобальным", который не зависит от конкретного экземпляра:

class MyClass
{

    protected static $options = array(
            'key1' => 2,
            'key2' => __DIR__ .'/mypic.png' // Triggers a syntax error
    );

    public function __construct() {}

}

РЕДАКТИРОВАТЬ разъяснение по вопросу. Меня интересует «почему», это невозможно. Например, говоря о статических вещах, любой знает, что это невозможно:

public static function getName() { return $this->name; }

, поскольку getName() используется несколькими экземплярами, а $this->name не имеет никакого смысла, потому что статическая функция «не знает», к какому экземпляру обращаться.

1 Ответ

4 голосов
/ 18 февраля 2012

Не допускается использование __DIR__ или магических констант, в частности, здесь. Это динамическое построение чего-либо внутри определения свойства, которое не допускается. Вы также получите синтаксическую ошибку, если попытаетесь объединить две атомарные строки, такие как "a" . "b", в определении статического свойства.

Из документов:

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

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

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