array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'function.eval.php', 1 => 'eval', ), 'up' => array ( 0 => 'ref.misc.php', 1 => 'Разные функции', ), 'prev' => array ( 0 => 'function.die.php', 1 => 'die', ), 'next' => array ( 0 => 'function.exit.php', 1 => 'exit', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'reference/misc/functions/eval.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 4, PHP 5, PHP 7, PHP 8)
eval — Расценивает строку как PHP-код и выполняет его
Выполняет переданную в параметре code
строку как код PHP.
Выполняемый код наследует ту же область видимости переменной, что и строка, на которой языковая конструкция eval() была вызвана. Любые доступные на этой строке переменные будут доступны для чтения и изменения в выполняемом коде. Однако все объявленные в этом коде функции и классы получат глобальную область видимости. Говоря по-другому, компилятор расценит выполняемый код так, как если бы это был подключёный файл.
Языковая конструкция eval() может быть очень опасной, поскольку может выполнять произвольный код. Поэтому от работы с ней воздерживаются. Если тщательный поиск других решений показал, что альтернативы нет, внимательно проверяют, чтобы в неё не передавались пользовательские данные без их правильной предварительной проверки.
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 в таких случаях
возвращалось логическое значение 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).
Замечание:
В случае фатальной ошибки в выполняемом коде прекращается выполнение всего скрипта.