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