(PHP 4, PHP 5, PHP 7, PHP 8)
eval — Оценивает строку как PHP-код
Языковая конструкция оценивает строку code
как PHP-код.
Код, который оценивает конструкция, наследует область видимости переменных той строки, на которой вызвали языковую конструкцию eval(). Каждая переменная, которая доступна на этой строке, будет доступна для чтения или изменения в строке кода, которую оценивает языковая конструкция. При этом функции и классы, которые объявляются в коде, который оценивает конструкция, получат глобальную область видимости. Компилятор рассматривает код, который обработала конструкция, так, как если бы код подключили отдельным файлом.
Языковая конструкция eval() представляет серьёзную опасность, поскольку разрешает выполнять произвольный PHP-код. Поэтому не рекомендуется пользоваться этой языковой конструкцией. Если после тщательной проверки выяснилось, что альтернатив конструкции нет, внимательно проверяют, чтобы без правильной предварительной проверки в языковую конструкцию не передавались пользовательские данные.
code
Корректный PHP-код для оценки и выполнения.
Код нельзя оборачивать открывающим и закрывающим
PHP-тегами, то есть
необходимо передать строку «echo "Привет!";
»,
а не «<?php echo "Привет!"; >
».
По-прежнему разрешается переключаться между режимами PHP- и HTML-кода, например:
«echo "Код PHP!"; ?>Код HTML<?php echo "Снова код PHP!";
».
Кроме этого, в параметр требуется передавать корректный PHP-код. Требование включает и то,
что инструкции требуется правильно разделять точкой с запятой.
Строка «echo "Привет!"
» сгенерирует ошибку синтаксиса,
а строка «echo "Привет!";
» будет работать.
Инструкция return
немедленно прекратит вычисление кода.
Код выполнится в области видимости кода, который вызывал конструкцию eval(). Поэтому переменные, которые определили или изменили в вызове eval(), сохранят видимость после завершения вызова конструкции.
Языковая конструкция eval() возвращает значение null
,
если только в вычисляемом коде не вызывается инструкция return
.
Начиная с PHP 7, если в вычисляемом коде допустили синтаксическую ошибку,
конструкция eval() выбрасывает исключение ParseError.
До PHP 7 в таких случаях eval() возвращала логическое значение false
,
а следующий код выполнялся в обычном режиме. Невозможно отловить синтаксическую ошибку
в конструкции eval() функцией set_error_handler().
Пример #1 Пример использования языковой конструкции eval() — простое слияние текста
<?php
$string = 'чашка';
$name = 'кофе';
$str = 'Это — $string $name.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
Результат выполнения приведённого примера:
Это — $string $name. Это — чашка кофе.
Замечание: Поскольку это языковая конструкция, а не функция, её нельзя вызывать как функцию переменной или передавать как именованный аргумент.
Как и всё, что выводит результат в браузер, функции контроля вывода можно вызывать, чтобы перехватить выводимые этой функцией данные и сохранять их, например в строку (string).
Замечание:
Весь скрипт завершает работу, если в вычисляемом коде возникла фатальная ошибка.