САМОУЧИТЕЛЬ PHP 4



         

Выполнение кода


int eval(string $code)

Эта функция делает довольно интересную вещь: она берет параметр $st и, рассматривая его как код программы на PHP, запускает. Если этот код возвратил какое-то значение оператором return (как, например, это обычно делают функции), eval()

также вернет эту величину.

Параметр $st представляет собой обычную строку, содержащую участок PHP-программы. То есть в ней может быть все, что допустимо в сценариях:

r

ввод-вывод, в том числе закрытие и открытие тэгов <? и ?>;

r    управляющие инструкции: циклы, условные операторы и т. д.;

r    объявления и вызовы функций;

r    вложенные вызовы функции eval().

Тем не менее, нужно помнить несколько важных правил[E127] [DK128] .

r    Код в $st

будет использовать те же самые глобальные переменные, что и вызвавшая программа. Таким образом, переменные не локализуются

внутри eval().

r    Любая критическая ошибка (например, вызов неопределенной функции) в коде строки $st

приведет к завершению работы всего сценария (разумеется, сообщение об ошибке также напечатается в браузер). Это значит, что мы не можем перехватить все ошибки в коде, вставив его в eval().

Последний факт вызывает довольно удручающие мысли. К сожалению, разработчики PHP опять не задумались о том, как было бы удобно, если бы eval() при ошибке в вызванном ей коде просто возвращала значение false, помещая сообщение об ошибке в какую-нибудь переменную (как это сделано, например, в Perl).

r    Тем не менее, синтаксические ошибки и предупреждения, возникающие при трансляции кода в $st, не приводят к завершению работы сценария, а всего лишь вызывают возврат из eval()значения ложь. Что ж, хоть кое-что.

Не забывайте, что переменные в строках, заключенных в двойные кавычки, в PHP интерполируются (то есть заменяются на соответствующие значения). Это значит, что, если мы хотим реже использовать обратные слэши для защиты символов-кавычек, нужно стараться применять строки в апострофах для параметра, передаваемого eval(). Например:




Содержание  Назад  Вперед