Является ли @ $ array ['возможный_missing_key'] антипаттерном? - PullRequest
8 голосов
/ 14 декабря 2010

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

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 14 декабря 2010

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

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

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

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

6 голосов
/ 14 декабря 2010

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

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

4 голосов
/ 14 декабря 2010

Или

$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null;
1 голос
/ 14 декабря 2010

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

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

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

1 голос
/ 14 декабря 2010

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

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

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

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

1 голос
/ 14 декабря 2010

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

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

...