Intereting Posts
PHP – замена Captcha расположение заголовка php vs php_redirect Диапазон HTTP, потоковая передача, музыка и аудио PHP передаёт переменную id через href Класс «Google_Config» не найден Получить текущий драйвер PDO из существующего соединения? Как аутентифицировать пользователей из двух приложений Yii на одном сервере? Борьба за установку названий страниц для динамических страниц PHP на сайте WordPress PHP Повернуть изображение из файла запроса Где редактировать для увеличения памяти в PHP ini-файле? Как подписать сертификат X.509 с RS256 в PHP? Не удалось получить действительный отпечаток пальца … x5t Как сплайсировать массив для вставки массива в определенную позицию? отображать данные из двух таблиц Mysql, получая значения из выпадающего списка, используя php Является en_UK незаконным языком? Запретить пользователю использовать кнопку «Назад» с предупреждением или отключить любую вставку

PHP Использование языковых конструкций в сочетании с магическими методами

Этот вопрос заставлял меня любопытно использовать языковые конструкции в сочетании с магическими методами 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'], []); он работает так, как ожидалось.