9.4. Отладка
Функции отладки помогают определить, что же происходит на самом деле с нера­ботающим сценарием. Некоторые из этих функций позволяют получить диагностическую информацию, имеющуюся в любом сценарии. Другие обмениваются информацией с системным журналом или удаленным отладчиком. Практические подходы к отладке подробно описываются в главе 28, "Эффективность и отладка". 
assert(boolean expression) assert(string expression)
Функция assert (листинг 9.59) тестирует выражение (аргумент expression). Если возвращается результат TRUE, никаких действий не предпринимается и сценарий продолжает работу. При возвращении значения FALSE дальнейшее поведение сценария диктуется параметрами assertion. По умолчанию параметры assertions не активизированы, а это означает, что они будут попросту проигнорированы. Для их активизации используются установки assert_options. Оценка суждений является отличным способом добавления в программный код проверки его функционирования, особенно при строгой проверке, которые необходимы при разработке, но не при работе программного продукта. Если параметр expression является строкой, PHP оценит ее с помощью функции eval . Это позволит сэкономить время на синтаксический анализ, необходимый для анализа выражения.

| Листинг 9.59. Функция assert_
<?php
// создать обычную функцию оценки
function failedAssertion($file, $line, $expression) {
print("E> строке $line, файла '$file' "); prinM"^ прошла следующая оценка: '$expression'<br>n");
}
// включить параметры оценки assert_options(ASSERT_ACTIVE, TRUE); // обработка в случае сбоя оценки
assert_options(ASSERT_CALLBACK, "failedAssertion");
// оценить ложное выражение
assert("1 == 2");

value assert_options(integer flag, value)
Функция assert_options предназначена для установки и получения значений флагов оценки. В табл. 9.15 приведены флаги и их значения. Большинство параметров являются логическими, так как они могут принимать только значения on/off. Исключением является параметр установки функции callback, который принимает имя функции, вызываемой при неуспешном завершении оценки. Эта функция вызывается с указанием трех аргументов: имя файла, номер строки и выражение, давшее значение FALSE.
Если вы хотите зарегистрировать для функции callback метод класса, ей следует передать массив с двумя элементами. Первым является имя класса, вторым - имя метода. Для того чтобы зарегистрировать метод объекта, передайте ссылку на объект в качестве первого элемента.
В табл. 9.15 описываются параметры, устанавливаемые с помощью функции assert.
Операционная система
boolean class_exists(string name)
Функция class_exists (листинг 9.60) проверяет существование класса.

Листинг 9.60. Функция class_exists

<?php
class Counter
{
private $value; function Counter()
$this->value = 0; function getValue()
return($this->value); function increment()
$this->value++;
}}
if(!class_exists('counter'))
{
print('Класс counter не существует!'); exit();
}
$c = new Counter; $c->increment(); $c->increment(); print($c->getValue());
?> 
closelog()
Функция closelog завершает любое подключение к системному журналу. Вызов этой функции не является обязательным, так как по необходимости PHP может сам завершить соединение. Пример использования этой функции можно найти в примере для функции syslog.
boolean connection_aborted()
Функция connection_aborted (листинг 9.61) используется для проверки прерывания запроса к сценарию. Пользователь может это сделать, щелкнув в браузере на кнопке Остановить или полностью завершив работу браузера. Обычно сценарий автоматически завершает работу при выходе из браузера. Однако это поведение можно изменить с помощью функции ignore_user_abort. Установить обработку прерывания работы можно в конфигурационном файле php.ini или с помощью директивы Web-сервера Apache. PHP может определить прерывания работы только после попытки отправки данных в браузер.

Листинг 9.61. Функция connection_aborted

<?php
// разрешить выполнение сценария после прерывания ignore_user_abort(TRUE); //fake a long task for($i=0; $i < 20; $i++)
{
print(' Работаем....^^'); sleep(1);
}
//Проверка прерывания if(connection_aborted())
{
//Записать в журнал, что процесс был завершен openlog("TEST", LOG_PID | LOG_CONS, LOG_USER); syslog(LOG_INFO, " Задача завершена!"); closelog();
}
else
{
print("Спасибо за ожидание! n");
}
?>