eval
Выполняет строку, переданную в параметре code , как код PHP.
Языковая конструкция eval() может быть очень опасной, поскольку позволяет выполнить произвольный код. Использование данной функции не рекомендуется. Если вы полностью убеждены, что нет другого способа, кроме использования этой конструкции, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленные пользователем, без предварительной проверки.
Список параметров
Выполняемая строка кода PHP.
Код не должен быть обёрнут открывающимся и закрывающимся тегами PHP, то есть строка должна быть, например, такой ‘echo «Привет!»;’ , но не такой » . Возможно переключаться между режимами PHP- и HTML-кода, например ‘echo «Код PHP!»; ?>Код HTML
Передаваемый код должен быть верным исполняемым кодом PHP. Это значит, что операторы должны быть разделены точкой с запятой (;). При исполнении строки ‘echo «Привет!»‘ будет сгенерирована ошибка, а строка ‘echo «Привет!»;’ будет успешно выполнена.
Указание в коде ключевого слова return прекращает исполнение кода в строке.
Исполняемый код из строки будет выполняться в области видимости кода, вызвавшего eval() . Таким образом, любые переменные, определённые или изменённые в вызове eval() , будут доступны после его выполнения в теле программы.
Возвращаемые значения
Функция eval() возвращает null , если не вызывается return , в случае чего возвращается значение, переданное return . С PHP 7, если в исполняемом коде присутствует ошибка, то eval() вызывает исключение «ParseError». До PHP 7 в этом случае возвращается false и продолжается нормальное выполнение последующего кода. Невозможно поймать ошибку парсера в eval() , используя set_error_handler() .
Примеры
Пример #1 Пример функции eval() — простое слияние текста
$string = ‘чашка’ ;
$name = ‘кофе’ ;
$str = ‘Это $string с моим $name.’ ;
echo $str . «\n» ;
eval( «\$str = \» $str \»;» );
echo $str . «\n» ;
?>?php
Результат выполнения данного примера:
Это $string с моим $name. Это чашка с моим кофе.
Примечания
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.
Как и с любой другой функцией, осуществляющей вывод непосредственно в браузер, вы можете использовать функции контроля вывода, чтобы перехватывать выводимые этой функцией данные и сохранять их, например, в строку ( string ).
Замечание:
В случае фатальной ошибки в исполняемом коде прекращается исполнение всего скрипта.
Смотрите также
Какова альтернатива функции eval?
Я использую eval() в своем текущем проекте следующим образом:
if (class_exists($class_name)) //$class_name depends on user input eval($class_name.'::MyStaticMethod()');
eval() выполняется тогда и только тогда, когда существует класс с именем $class_name поэтому он безопасен, но я все же не думаю, что это лучшее решение.
Могу ли я сделать то же, что делает код выше без eval() ?
Я недавно ответил на этот вопрос . Последняя часть моего ответа прекрасно отвечает на этот вопрос и гораздо полезнее для будущих читателей, чем ответы, представленные здесь. Вот почему я отвечаю на свой вопрос.
PHP имеет функции, которые дают возможность избежать использования eval в большинстве случаев:
- PHP – очень динамичный язык. Он имеет возможность делать следующие вещи со strings :
Определить и / или получить переменную (поддерживается PHP 4.3). Например:
$variableName = 'MyVariable'; // Create new variable with the name defined in variable $variableName $ = 'MyValue'; //Outputs: string(7) "MyValue" var_dump($MyVariable); //Outputs: string(7) "MyValue" var_dump($);
// Create function with the name defined in variable $functionName function MyFunction($argument) < return 'Argument passed is: '.$argument; >$functionName = 'MyFunction'; // Outputs: // string(48) "Argument passed is: Calling MyFunction directly." var_dump(MyFunction('Calling MyFunction directly.')); // Outputs: // string(51) "Argument passed is: Calling MyFunction with string." var_dump($functionName('Calling MyFunction with string.'));
class MyClass < public function __construct() < echo 'Constructing MyClass'."\n"; >> $className = 'MyClass'; $objFromString = new $className(); // Outputs: object(MyClass)#1 (0) <> var_dump($objFromString);
class MyClass < public static function staticMethod() < return 'MyClass::staticMethod called'; >> $staticMethodName = 'staticMethod'; // Outputs: string(28) "MyClass::staticMethod called" var_dump(MyClass::$staticMethodName());
class MyClass < public static function staticMethod() < return 'MyClass::staticMethod called'; >> $className = 'MyClass'; $staticMethodName = 'staticMethod'; var_dump($className::$staticMethodName()); var_dump($className::staticMethod());
class MyClass < public function instanceMethod() < return 'MyClass::instanceMethod called'; >> $methodName = 'instanceMethod'; $obj = new MyClass(); // Outputs: string(30) "MyClass::instanceMethod called" var_dump($obj->$methodName());
class MyClass < public static $myStaticProperty; public $myInstanceProperty; >$staticPropertyName = 'myStaticProperty'; $instancePropertyName = 'myInstanceProperty'; MyClass::$ = 'my static value'; $obj = new MyClass(); $obj-> = 'my instance value'; var_dump(MyClass::$); var_dump($obj->);
call_user_func(array($class_name, 'MyStaticMethod'));
Я бы предложил call_user_func .
Альтернативой можно было бы назвать это следующим образом:
$class_and_method = "Class::MyStaticMethod()"; $class_and_method();
Adisory: userinput + eval = отверстие безопасности;
Также eval – дорогостоящая операция, требующая разбора строки в исполняемый формат (дерево синтаксического анализа, абстрактное синтаксическое дерево и т. Д.) И выполнение новой найденной логики.
Вы не хотите анализировать каждую мелочь кода. Используйте eval, если у вас есть что-то для этого, чтобы пережевывать или, скорее, ставить эту логику где-то, где она многократно используется и параметризируется, например, функция.
$method = array('class_name', 'method_name'); $method(); // calls class_name::method_name()
Чем заменить eval
Добрый вечер. Я в php новичёк, занимаюсь им по мере поступления ошибок.
Подскажите пожалуйста, чем можно заменить работу eval в этом коде.
и для чего здесь парсинг делается?
$regexp = ‘/()/s’;
$tokens = preg_split($regexp, $text, -1, PREG_SPLIT_DELIM_CAPTURE);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/** * Исполняет PHP-код в шаблоне * * @param string $text содержание шаблона * @return string */ private function php_in_theme($text) { $result = ''; $regexp = '/()/s'; $tokens = preg_split($regexp, $text, -1, PREG_SPLIT_DELIM_CAPTURE); $cnt = count($tokens); $result .= $tokens[0]; $i = 1; while ($i $cnt) { $i++; ob_start(); eval($tokens[$i++]); $result .= ob_get_contents(); ob_end_clean(); $result .= $tokens[$i++]; } return $result; }
Заменить eval
Добрый день. Есть такой кусочек кода: function flash_quarter(n) < .
сма DAEWOO DWD M1029A чем заменить транс, трансформатор в обрыве, чем заменить
день добрый. модуль PN:361430A950 первичная транса в обрыве . может кто подскажет параметры .
Чем можно заменить заменить toggle() ?
Добрый день, у меня такой вопрос. Чем можно заменить toggle(function(), function()); В ранних.
Чем заменить?
Чем заменить кондеры 100n в программатор на FT232RL? Ибо в трёх нигазах таких кондеров нет в любом.
Сообщение от UseMuse
Сообщение от UseMuse
Сообщение от UseMuse
и для чего здесь парсинг делается?
$regexp = ‘/()/s’;
$tokens = preg_split($regexp, $text, -1, PREG_SPLIT_DELIM_CAPTURE);
Сообщение от UseMuse
Сообщение от UseMuse
Сообщение от Jewbacabra
require_once(): Failed opening required ‘http://tdvolgin.ru/userfiles/include/regions.php?my_city=u0423153.isp.regruhosting.ru&place=1′ (include_path=’.:’)
/var/www/u0423153/data/www/u0423153.isp.regruhosting.ru/custom/my/includes/parser_theme.php(158) : eval()’d code:15
Добавлено через 1 минуту
Сообщение от Jewbacabra
Не я автор, мне нужно просто вылечить ошибку. думал если парсинг этот «как правило», то может кто знает зачем так парсить
Failed opening required ‘http://tdvolgin.ru/userfiles/include/regions.php?my_city=u0423153.isp.regruhosting.ru&place=1’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
/** * Шаблон стартовой страницы сайта * * @package DIAFAN.CMS * @author diafan.ru * @version 5.4 * @license http://www.diafan.ru/license.html * @copyright Copyright (c) 2003-2015 OOO «Диафан» (http://www.diafan.ru/) */ if(! defined("DIAFAN")) { include dirname(dirname(__FILE__)).'/includes/404.php'; } ?> /** * Шаблон стартовой страницы сайта * * @package DIAFAN.CMS * @author diafan.ru * @version 5.4 * @license http://www.diafan.ru/license.html * @copyright Copyright (c) 2003-2015 OOO «Диафан» (http://www.diafan.ru/) */ if(! defined("DIAFAN")) < include dirname(dirname(__FILE__)).'/includes/404.php'; > favicon.png" /> favicon_54x54.png"/> echo ' '; ?> echo ' '; if(!empty($this->diafan->_users->id)) { echo '; } else { echo ''; } ?> if(!empty($this->diafan->_users->id)) < echo ' else < echo ' '; >