Как осуществлять подавление ошибок в PHP?

Я часто вижу, что пишут примерно такой код.
if(isset($arr['a']) && isset($arr['a']['b']) && isset($arr['a']['b']['c'])) {
    $v = $arr['a']['b']['c'];
}
else {
    $v = null;
}

Но ведь тоже самое, можно написать компактнее, воспользовавшись подавлением ошибки доступа к элементам массива. В случае ошибки будет возвращен null.
$v = @$arr['a']['b']['c'];
Почему многие предпочитают первый способ? Религия не позволяет использовать подавление ошибок даже для минимального выражения? Или есть еще какие-то причины?
  • Вопрос задан
  • 3116 просмотров
Пригласить эксперта
Ответы на вопрос 6
@andymitrich
Software Developer
Не знаю насчет религии, но точно можно было бы обойтись одним isset($arr['a']['b']['c']) в условии.
Ответ написан
если есть ошибка, ее нужно устранить, а не подавить. Подавление ошибок - один из признаков говнокода.
Ответ написан
sajgak
@sajgak
$v = isset($arr['a']['b']['c']) ? $arr['a']['b']['c'] : null;
Ответ написан
Комментировать
catanfa
@catanfa
вот здесь автор предлагает несколько решений, объясняет подводные камни nikic.github.io/2014/01/10/The-case-against-the-if...

а если начать использовать @, то можно потерять действительно нужные ошибки и отладка станет очень тяжелой. Представьте, ничего плохого не произойдёт, если вы одну-единственную переменную в проекте назовёте $a;Но если таких переменных будет много, код станет невыносимым. Здесь похоже такая же логика.
Ответ написан
Комментировать
deadbyelpy
@deadbyelpy
веб-шмеб
$arr[$tables[$t]['name']]['rows'][$r]['cols'][$c]['format']['borders']['top'] - это конечно 3.14здец товарищи, но такая конструкция мне никогда не встречалась.

Есть несколько причин:

1) Наглядно видно что происходит в скрипте (есть ключ? нет - ставим default)
2) Упрощает отладку в дальнейшем. "@" скрывает ВСЕ ошибки.
3) Потому, что оператор "@" замедляет выполнение конструкции вида iffset(key) ? key : default в два раза. Даже если ошибки не возникает.

И если уж исходить из редких ситуаций. Представьте насколько замедлится скрипт при прохождении 100000 элементов.
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
if(isset($arr['a']['b']['c'])) {
    $v = $arr['a']['b']['c'];
}
else {
    $v = null;
}


$v = isset($arr['a']['b']['c']) ? $arr['a']['b']['c'] : null;

Потому что:
1) сразу понятно что имелось ввиду
2) быстрее
3) ошибки нужно не допускать, а допускать и подавлять сознательно - очень плохой тон, не сразу понятно что вы ожидали получить в результате, это быдлокод, не поддающийся отладке
4) становится похоже на то, что вы вообще не понимаете, что происходит и решили просто убрать отображение ошибки, то что вы там ожидаете null не очевидно чуть менее чем полностью

$arr[$tables[$t]['name']]['rows'][$r]['cols'][$c]['format']['borders']['top']

Страшновато, но программирование не всегда белое и пушистое. Можно либо циклом проверять, либо заняться рефакторингом и сделать более удобную для работы структуру.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы