(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).
Замечание:
Весь скрипт завершает работу, если в вычисляемом коде возникла фатальная ошибка.