Является ли @$array['возможный_missing_key'] анти-паттерном?

Можно ли использовать @ при извлечении возможно отсутствующего значения из массива PHP? Пример:

$value = @$array['possibly_missing_key'];

Предполагаемое поведение:

if (isset($array['possibly_missing_key'])) {
    $value = $array['possibly_missing_key'];
} else {
    $value = null;
}

Я хочу знать, прежде чем распространять шаблон использования.

6 ответов

Решение

@ Оператор подавляет сообщения об ошибках, и его использование потенциально настраивает ваш код для других ошибок и непредвиденного поведения, которые в итоге трудно отследить. Таким образом, это, безусловно, антипаттерн.

Таким образом, я бы очень предпочел второй бит. Это делает это намного яснее

  • что он может не присутствовать в массиве, и
  • каково значение по умолчанию, если его нет

Чтобы сделать его более кратким, вы можете использовать троичный условный оператор ?:, как видно из ответа Марка Бейкера. Чуть меньше кода и больше символов, но смысл общепризнан.

На самом деле isset вариация - это анти-паттерн. Если вы просто используете isset($var)?$var:NULL с намерением подавить "ошибку", вы ничего не добились, используя правильный синтаксис для подавления ошибок. Результат тот же, но менее читаемый.

Люди спорят об этом из-за ощущаемой "чистоты" и потому, что использование isset является микрооптимизацией. Как избежать @ и использование isset в качестве замены синтаксической соли - просто программирование культа груза.

Или же

$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null;

Третий вариант:

$value = (isset($array['key']) ? $array['key'] : null);

Я знаю, что это не дает прямого ответа на вопрос; Я бы поставил это как комментарий, за исключением того, что его действительно нужно было отформатировать.

Идея заключается в том, что если вы пытаетесь сделать свой код короче, используя однострочник вместо блока if-else, вы все равно можете перевести его в краткий однострочный текст, используя троичный оператор, что дает вам лучший обоих миров.

Игнорирование предупреждений - определенно антипаттерн; так что да, это анти-паттерн (и я могу гарантировать, что если вы научитесь подавлять предупреждения, один из них вернется и укусит вас сзади, если не хуже).

Кроме того, хотя вторая версия более многословна, она дает неинициализированной переменной известное состояние (или может использоваться для решения проблемы, если предполагается, что переменная должна быть заполнена).

Второй блок кода (или альтернатива Марка Бейкера, которая будет работать точно так же) лучше. Я не совсем уверен в PHP, но во многих других языках программирования простое игнорирование переменной почти наверняка приведет к ошибке. По крайней мере, со вторым блоком вы инициализируете переменную для некоторого значения или ячейки памяти.

Подавление ошибок следует использовать чаще, если вы ожидаете, что функция выдаст ожидаемую ошибку в конечном продукте (однако в большинстве случаев это будет не так).

Удачи!
Деннис М.

Другие вопросы по тегам