У меня есть сценарий 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.
Использование @ для подавления ошибок, как правило, является плохой вещью, так как это делает отладку действительно трудной. Например, допустим, что вы сделали опечатку в имени переменной (обратите внимание на двойной знак доллара):
if(@$$opts['small']) $classes .= "smallBtn";
Это будет постоянно ложным без каких-либо ошибок.
Если вы хотите сократить свой код, возможно, просто используйте функцию, что-то вроде:
function optionIsTrue($opts, $key) {
return isset($opts[$key]) && $opts[$key] === true;
}
if (optionIsTrue($opts, "small")) {
$classes .= 'smallBtn';
}
Лично я предпочел бы первый подход в отношении Руководство по чистому коду а также Читаемость кода.
Я не буду подавлять любые ошибки там, где это возможно.
Надлежащим способом является длительная проверка, чтобы ошибка никогда не возникала. Подавление ошибки устраняет симптом, но не устраняет ошибку. Следующий отрывок из вашего вопроса является правильным ответом:
if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';
Вы правы, когда хотите сделать код короче и проще для чтения. Но я видел много PHP-кода, созданного другими экспертами, и единственное подавление ошибок «@», которое я когда-либо видел в производственном коде, — это то, которое я сам добавил для быстрого исправления. После того, как мои коллеги отчитали меня, я быстро ввел правильную и многословную проверку, чтобы ошибка никогда не возникала.
Я сделал комментарий, но вы не могли увидеть разницу, вот оно:
Ну, согласно Стандарты кодирования PEAR Вы должны просто, во-первых, лучше подходить, но для лучшей практики, и для лучшего понимания после просмотра просто попробуйте прочитать это:
if(isset($opts['small'])
&& $opts['small']
) {
$classes .= 'smallBtn';
}
И насколько я знаю, вы никогда не должны подавлять ошибки