Анимация
JavaScript
|
Главная Библионтека Да, поначалу будут очень раздражать "мелкие" сообщения типа "использование неинициализированной переменной". Практика показывает, что эти предупреждения на самом деле свидетельствуют (чаще всего) о возможной логической ошибке в программе, и что при их отключении может возникнуть ситуация, когда программу будет очень трудно отладить. Примечание Однажды я просидел несколько часов, тщетно пытаясь найти ошибку в сценарии (он работал, но неправильно). После того как я включил полный контроль ошибок, все выяснилось в течение 5 минут. Вот вам и выигрыш по времени... Оператор отключения ошибок Есть и еще один аргумент за то, чтобы всегда использовать полный контроль ошибок. Это - существование в PHP оператора @. Если этот оператор поставить перед любым выражением, то все ошибки, которые там возникнут, будут проигнорированы. Например: if(!@filemtime("notextst.txt")) echo "Файла не существует!"; Попробуйте убрать оператор @ - тут же получите сообщение: "Файл не найден", а только после этого - вывод оператора echo. Однако с оператором @ предупреждение будет подавлено, что нам и требовалось. Кстати, в приведенном примере, возможно, несколько логичнее было бы воспользоваться функцией file exists() , которая как раз и предназначена для определения факта существования файла, но в некоторых ситуациях это нам не подойдет. Например: Обновить файл, если его не существует или он очень стар1Й if(!file exists($fname) filemtime($fname)<time()-60*60) MyFunctionForUpdateFile($fname); Сравните со следующим фрагментом: Обновить файл, если его не существует или он очень старый if(@filemtime($fname)<time()-60*60) MyFunctionForUpdateFile($fname); Всегда помните об операторе @. Он крайне удобен. Подумайте, стоит ли рисковать, устанавливая слабый контроль ошибок при помощи Error reporting() , если его и так можно локально установить при помощи @? По-моему, нет. Пример использования оператора @ Вот еще один полезный пример использования оператора @ . Пусть у нас имеется форма с submit-кнопкой, и нам нужно в сценарии определить, нажата ли она. Мы можем сделать это так: <? if(!empty($submit)) echo "Кнопка нажата!"; ?> Но, согласитесь, следующий код куда элегантнее: <? if(@$submit) echo "Кнопка нажата!" ?> <form action=<?=$SCRiPT NAME?> method=post> <input type=submit name=submit value="Go!"> </form> Старайтесь чаще пользоваться оператором @ и реже - установкой слабого контроля ошибок. Принудительное завершение программы void exit() Эта функция немедленно завершает работу сценария. Из нее никогда не происходит возврата. Перед окончанием программы вызываются функции-финализаторы, которые скоро будут нами рассмотрены. void die(string $message) Функция делает почти то же самое, что и exit() , только перед завершением работы выводит строку, заданную в параметре $message. Чаще всего ее применяют, если нужно напечатать сообщение об ошибке и аварийно завершить программу. Полезным примером применения die() может служить такой код: $filename=/path/to/data-file; $file=fopen($filename, r) or die("не могу открыть файл $filename!"); Здесь мы ориентируемся на специфику оператора or - "выполнять" второй операнд только тогда, когда первый "ложен". Мы уже встречались с этим приемом в главе, посвященной работе с файлами. Заметьте, что оператор здесь применять нельзя - он имеет более высокий приоритет, чем =. С использованием последний пример нужно было бы переписать следующим образом: $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 этой книги). 0 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 105 106 107 108 109 110 [ 111 ] 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |