| |
ужно было бы переписать следующим образом:
Часть IV. Стандартные функции PHP 338
$filename='/path/to/data-file';
($file=fopen($filename, 'r')) || die("не могу открыть файл $filename!");
Согласитесь, последнее практически полностью исключает возможность применения
|| в подобных конструкциях.
Финализаторы
Слава богу, разработчики PHP предусмотрели возможность указать в программе
функцию-финализатор, которая будет автоматически вызвана, как только работа
сце-
нария завершится — неважно, из-за ошибки или легально. В такой функции мы мо-
жем, например, записать информацию в кэш или обновить какой-нибудь файл жур-
нала работы программы. Что же нужно для этого сделать?
Во-первых, написать саму функцию и дать ей любое имя. Желательно также, чтобы
она была небольшой, и чтобы в ней не было ошибок, потому что сама функция,
впол-
не возможно, будет вызываться перед завершением сценария из-за ошибки. Во-
вторых зарегистрировать ее как финализатор, передав ее имя стандартной функции
Register_shutdown_function().
int Register_shutdown_function(string $func)
Регистрирует функцию с указанным именем с той целью, чтобы она автоматически
вызывалась перед возвратом из сценария. Функция будет вызвана как при окончании
программы, так и при вызовах exit() или die(), а также при фатальных ошибках,
приводящих к завершению сценария — например, при синтаксической ошибке.
Конечно, можно зарегистрировать несколько финальных функций, которые будут
вызываться в том же порядке, в котором они регистрировались.
Правда, есть одно "но". Финальная функция вызывается уже после закрытия
соедине-
ния с браузером клиента. Поэтому все данные, выведенные в ней через echo,
теряют-
ся (во всяком случае, так происходит в Unix-версии PHP, а под Windows
CGI-версия
PHP и echo работают прекрасно). Так что лучше не выводить никаких данных в та-
кой функции, а ограничиться работой с файлами и другими вызовами, которые ниче-
го не направляют в браузер.
Последнее обстоятельство, к сожалению, ограничивает функциональность финализа-
торов: им нельзя поручить, например, вывод окончания страницы, если сценарий по
каким-то причинам прервался из-за ошибки. Вообще говоря, надо заметить, что в
PHP никак нельзя в случае ошибки в некотором запущенном коде проделать какие-
либо разумные действия (кроме, разумеется, мгновенного выхода). Это несколько
может ограничивать область применимости PHP для написания шаблонизатора (о
шаблонах будет подробно рассказано в части V этой книги).
Глава 24. Управление интерпретатором 339
Генерация кода
во время выполнения
Так как PHP в действительности является транслирующим интерпретатором, в нем
заложены возможности по созданию и выполнению кода программы прямо во время
ее выполнения. То есть мы можем писать сценарии, которые в буквальном смысле
создают сами себя, точнее, свой код! Это незаменимо при написании
шаблонизаторов
и функций, занимающихся динамическим формированием писем. Мы поговорим о
таких функциях в части V книги.
Выполнение кода
int eval(string $code)
Эта функция делает довольно интересную вещь: она берет параметр $st и, рассмат-
ривая его как код программы на PHP, запускает. Если этот код возвратил какое-то
знач
|
|