16:12 

Месть подавителя @

Джей Ди
Всё будет Кока-Кола.
Совет для новичков и модульных систем.

Оказывается при использовании собачки в купе с include или require, может дать крайне нехороший результат.

Т.е., если вы считаете что @include 'some.php' подавит сообщение об ошибке, если такого файла не существует - вы правы, однако если такой файл есть, то оператор подавит ВСЕ ошибки в вызываемой библиотеке.

Думаете хорошо? Нет.

Рассмотрим пример:
Есть 10 библиотек вызываемых циклом с @include/@require. В одной из них допущена критическая ошибка.
Самое вкусное, что это сообщение в какой библиотеке произошла ошибка и какая - вы не увидите, программа просто прервется и всё.

Вывод:
При вызове большого числа библиотек, лучше использовать конструкцию file_exists, а не @include/@require.

Вот так-то!

P.S. Проверялось в 4 версии, по моим данных в 5 аналогичная ситуация.

@темы: PHP, Интересности, Советы и Секреты

Комментарии
2008-09-14 в 16:19 

--==SS==--
Sanctus Satanas
Интересно. Но, строго говоря, подавление вывода ошибок вообще штука сама по себе малополезная. Лучше писать ошибки в лог, а пользователя обламывать пустой страницей, как это и сделано на большинстве хостингов.

2008-09-14 в 16:21 

Джей Ди
Всё будет Кока-Кола.
--==SS==-- тут идет именно вопрос отладки, ты ведь не будешь каждый раз залаить в лог? При релизе, так делать можно - никаких проблем, а вт когда ищешь ошибку в 10 модулях... подключая по одному. =)

2008-09-14 в 16:23 

--==SS==--
Sanctus Satanas
Дык при отладке чем помешает сообщение об ошибке? Зачем @ вообще было ставить?

2008-09-14 в 16:28 

Джей Ди
Всё будет Кока-Кола.
--==SS==-- ошибка многих, обычно используется если число подключаемых модулей может быть динамическим.

2008-09-14 в 16:29 

 
однако если такой файл есть, то оператор подавит ВСЕ ошибки в вызываемой библиотеке
О, а ведь это крайне удобно. ))
Не знал (и даже не задумывался, впрочем, что include/require можно совместить с собачкой). Спасибо.

P.S. PHP 5.2.1 - работает аналогично. А, да, и @eval() - тоже.

2008-09-14 в 16:38 

Джей Ди
Всё будет Кока-Кола.
Мне показалось, что это не всегда удорбно. :)

2008-09-14 в 20:31 

Nuclear Snow
Never Say Never (c)
@include/@require...
я, если честно, не встречал...
а по теме - имхо использование собачки вообще лучше избегать.

2008-09-14 в 21:11 

Джей Ди
Всё будет Кока-Кола.
Nuclear Snow в принципе да. =)

2008-09-14 в 22:25 

[NOMAD] [DELETED user]
Собака - зло . Код нужно писать так,что бы на самом параноидальном уровне конроля ошибок не вылезало ни каких Warning'ов или Error'ов...

2008-09-15 в 00:08 

--==SS==--
Sanctus Satanas
[NOMAD] Ну, допустим, это не всегда удобно. Например, если мы получаем параметр из массивов $_GET, $_POST и т.п. и нам лень делать проверку типа isset() или empty() и нас устраивает, что значение по умолчанию будет нулевое.

2008-09-15 в 00:20 

> нам лень делать проверку
Вот!!! Вот она, мать родная большинства багов - лень программиста )))

P.S. А что тут сложного,в самом начале скрипта сделать блок с проверками isset() или empty() ?

2008-09-15 в 09:02 

--==SS==--
Sanctus Satanas
Сложного ничего, только код загромождает. Этих проверок и так обычно много требуется.

2008-09-15 в 12:56 

Это же не вложенное и ветвящееся во все стороны if или switch.

2008-09-15 в 13:49 

--==SS==--
Sanctus Satanas
Да в любом случае, что проще: написать @$_GET['something'] или извращаться с isset()'ами? Параноидально относиться нужно к тому, что передаётся пользователем, а не к тому, как у нас всё это работает.

2008-09-15 в 15:20 

Kuroi Kitsune
Проще написать функцию подобную:
function _get_var($name) {
return (isset($_REQUEST[$name])) ? $_REQUEST[$name] : false ;
}

А не разводить ересь с "собаками".

2008-09-15 в 16:52 

Джей Ди
Всё будет Кока-Кола.
Kuroi Kitsune это уже дело привычки, у меня давно уже есть такая функция. Но временами всё же собака помогает, не всегда правда но часто - там где не нужна паранойя, а просто лень определять переменную до вызова.

2008-09-15 в 22:29 

--==SS==--
Sanctus Satanas
Хм... Забавно. Не ожидал, но способ Kuroi Kitsune оказался даже быстрее:
0.215471982956 vs 0.294816970825
0.217481851578 vs 0.290646076202
0.215773105621 vs 0.290854930878
0.218496084213 vs 0.290129184723
0.216236829758 vs 0.287453174591
0.220608949661 vs 0.286588907242
0.212882995605 vs 0.286224842072
0.217647075653 vs 0.287744045258
0.212151050568 vs 0.29031920433
0.217796087265 vs 0.290284872055
(первое число — через ж функцию, второе — просто через собачку)

2008-09-15 в 22:45 

[NOMAD] [DELETED user]
Что и требовалось доказать :) Собака - зло. Так же,как и перемешивание php кода и html .

2008-09-16 в 00:28 

Джей Ди
Всё будет Кока-Кола.
--==SS==-- [NOMAD] Kuroi Kitsune не забывайте про читабельность кода, а пару микросекунд дела не сделают - будующее оптимизации не оптимистично, всё дело за кешированием. =)

2008-09-16 в 00:39 

Волчонок Джей , да,конечно, кеширование это хорошо и читабельность кода важна. Но приведенный пример с функцией на мой взгляд вполне читабелен. Правда функцию лучше назвать иначе,что бы более ясно было ее назначение. Ну к примеру getRequestVar() . И все будет читабельно.

2008-09-16 в 14:29 

Джей Ди
Всё будет Кока-Кола.
[NOMAD] а лушчше просто get. =) У меня есть набор таких функций для всех массивов. =)

   

Сообщество PHP программистов

главная