Этот вопрос заставлял меня любопытно использовать языковые конструкции в сочетании с магическими методами PHP. Я создал демо-код:
<?php class Testing { public function scopeList() { echo "scopeList"; } public function __call($method, $parameters) { if($method == "list") { $this->scopeList(); } } public static function __callStatic($method, $parameters) { $instance = new static; call_user_func_array([$instance, $method], $parameters); } } //Testing::list(); $testing = new Testing(); $testing->list();
Почему Testing::list()
выдает синтаксическую ошибку, а $testing->list()
– нет?
Из-за PHP зарезервированных ключевых слов оба должны потерпеть неудачу?
Обновление PHP 7
PHP 7 обратился к описанному поведению и реализовал функцию, называемую контекстно-зависимым лексером, представленную marcio .
Ваш код будет работать с PHP 7.
Ситуация до PHP 7
Синтаксические ошибки выдаются до того, как PHP даже осознает тот факт, что метод доступен через __callStatic()
, это происходит на этапе синтаксического анализа.
Поведение, которое вы описали, похоже, является ошибкой в парсере PHP, по крайней мере, несоответствие, которое должно быть описано в документации.
Я бы опубликовал отчет об ошибке . Хороший улов!
Обновление: у файла OP есть файл отчета об ошибке, который можно найти здесь: https://bugs.php.net/bug.php?id=71157
Контекстно-зависимые идентификаторы теперь поддерживаются для PHP 7.0+, и ваш код будет работать. Обновление вашего PHP решит проблему.
Это был одобренный RFC, который внес изменения: https://wiki.php.net/rfc/context_sensitive_lexer .
Вы можете получить дополнительную информацию о новых функциях и об изменениях на следующей (неофициальной) ссылке на PHP 7: https://github.com/tpunt/PHP7-Reference#loosening-reserved-word-restrictions
По-моему, это потому, что зарезервированные слова,
если вы замените Testing::list();
с call_user_func_array(['Testing', 'list'], []);
он работает так, как ожидалось.