9

PHP配列から欠落している可能性のある値を抽出するときに@を使用しても大丈夫ですか?例:

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

意図された動作:

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

使用パターンを広める前に知りたい。

4

6 に答える 6

8

@オペレーターはエラー メッセージを抑制し、それを使用すると、追跡が困難になる他のエラーや予期しない動作に対してコードがセットアップされる可能性があります。したがって、これは間違いなくアンチパターンです。

したがって、私は2番目のビットを非常に好みます。それはそれをより明確にします

  • 配列に存在しない可能性があること、および
  • 存在しない場合のデフォルト値

より簡潔にするために、 Mark Ba​​ker's answer?:に見られるように、三項条件演算子を使用できます。コードが少し少なくなり、シンボルが増えましたが、その意味は十分に認識されています。

于 2010-12-14T16:34:33.280 に答える
7

実際、issetバリエーションはアンチパターンです。「エラー」を抑制するだけの意図で使用する場合はisset($var)?$var:NULL、エラーを抑制するための適切な構文を使用することに勝るものはありません。結果は同じですが、読みにくくなります。

認識された「清潔さ」と isset の使用はマイクロ最適化であるため、人々はそれについて議論しています。isset を回避@して構文上のソルト置換として使用することは、カーゴ カルト プログラミングにすぎません。

于 2010-12-14T16:43:21.783 に答える
4

または

$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null;
于 2010-12-14T16:35:29.410 に答える
1

3 番目のオプション:

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

これが質問に直接答えないことはわかっています。本当にフォーマットする必要があることを除いて、私はそれをコメントとして入れていたでしょう。

ここでの考え方は、if-else ブロックの代わりにワンライナーを使用してコードを短くしようとしている場合でも、三項演算子を使用して簡潔なワンライナーにすることができるということです。両方の世界の。

于 2010-12-14T16:38:20.447 に答える
1

警告を無視することは間違いなくアンチパターンです。そうです、これはアンチパターンです (そして、警告を抑制することを学べば、そのうちの 1 つが戻ってきて、最悪ではないにしても、後であなたを噛むことを保証できます)。

また、2 番目のバージョンはより冗長ですが、初期化されていない変数に既知の状態を与えます (または、変数が埋められることになっている場合は、問題を処理するために使用できます)。

于 2010-12-14T16:37:14.540 に答える
1

コードの 2 番目のブロック (またはまったく同じように動作する Mark Ba​​ker の代替手段) の方が優れています。PHP についてはよくわかりませんが、他の多くのプログラミング言語では、単純に変数を無視すると、ほぼ確実にエラーがスローされます。少なくとも 2 番目のブロックでは、変数を何らかの値またはメモリ位置に初期化しています。

関数が最終製品で予想されるエラーをスローすることが予想される場合は、エラー抑制をより一般的に使用する必要があります (ただし、多くの場合、これは当てはまりません)。

幸運を!
デニス M.

于 2010-12-14T16:39:51.177 に答える