стиль кодирования — PHP подавляет ошибки при проверке существования + значение логического?

У меня есть сценарий PHP, который использует массив параметров: $ opts []

$ opts может содержать 0 или более пар ключ-значение. Все значения логические.

При проверке существования ключа, а затем, что значение равно true, я делал следующее:

if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';

Это работает, но я чувствую, что это немного затянуто.

Подумав об этом, я предложил следующую альтернативу:

if(@$opts['small']) $classes .= "smallBtn";

Это намного меньше, но зависит от подавления ошибок @.

У меня вопрос, какой лучший способ сделать это?

Во-первых, многословно, но ясно, что он делает.

Второе короче, но может быть расценено как плохая практика кодирования?

ОБНОВИТЬ:

3-й вариант, и, на мой взгляд, лучший, использует пустой:

if(!empty($opts['small'])) $classes .= 'smallBtn';

Из руководства:

Предупреждение не генерируется, если переменная не существует. Это означает, что empty () по сути является кратким эквивалентом! Isset ($ var) || $ var == false.

0

Решение

Использование @ для подавления ошибок, как правило, является плохой вещью, так как это делает отладку действительно трудной. Например, допустим, что вы сделали опечатку в имени переменной (обратите внимание на двойной знак доллара):

if(@$$opts['small']) $classes .= "smallBtn";

Это будет постоянно ложным без каких-либо ошибок.

Если вы хотите сократить свой код, возможно, просто используйте функцию, что-то вроде:

function optionIsTrue($opts, $key) {
return isset($opts[$key]) && $opts[$key] === true;
}

if (optionIsTrue($opts, "small")) {
$classes .= 'smallBtn';
}
1

Другие решения

Лично я предпочел бы первый подход в отношении Руководство по чистому коду а также Читаемость кода.

Я не буду подавлять любые ошибки там, где это возможно.

1

Надлежащим способом является длительная проверка, чтобы ошибка никогда не возникала. Подавление ошибки устраняет симптом, но не устраняет ошибку. Следующий отрывок из вашего вопроса является правильным ответом:

if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';

Вы правы, когда хотите сделать код короче и проще для чтения. Но я видел много PHP-кода, созданного другими экспертами, и единственное подавление ошибок «@», которое я когда-либо видел в производственном коде, — это то, которое я сам добавил для быстрого исправления. После того, как мои коллеги отчитали меня, я быстро ввел правильную и многословную проверку, чтобы ошибка никогда не возникала.

1

Я сделал комментарий, но вы не могли увидеть разницу, вот оно:
Ну, согласно Стандарты кодирования PEAR Вы должны просто, во-первых, лучше подходить, но для лучшей практики, и для лучшего понимания после просмотра просто попробуйте прочитать это:

if(isset($opts['small'])
&& $opts['small']
) {
$classes .= 'smallBtn';
}

И насколько я знаю, вы никогда не должны подавлять ошибки

0