PHPはエラーなどのログが出そうなところで@演算子を使うと、出力を抑えることができます。でも使ってはいけません。
PHPを使い始めて10年以上経ちますが、1回も使ったことがないし実際コードで見たこともありません。
というか、こういうのがあるのすら忘れてた。
知らないのは非常識か? 使用不可が常識か?
プログラミングでのログ出力は、本来の処理とは関係ないもので暴論を言えばいらないです。じっさいスケジュールが詰まってくると、『そのへんは置いといて動くもの作って!』と言われることもあります。
これを言われると、エンジニアは地獄の入り口が見えるのでやりたくないんですが、置いといたままお役御免なんてこともしばしば。
仕事でプログラムを読むときソースコードのレベルが低いことがよくあります。でもプログラマのレベルが低いとはかぎりません。そのプログラマが納得してないこともあるから。
こういうことは良くあるので、ログ処理が中途半端なことが多々あります。
エラー制御演算子(@)は、意図的にログ出力を抑制するものです。外部要因でしぶしぶじゃなくて、わざと出さないもの。
冒頭で忘れてたというのは、ログをわざと出さないことはしないから。自分の首を絞めるようなもの。
使いみちがあるとすれば...
ログは開発時や保守・メンテのときに力を発揮します。トラブルを素早く対応するには絶対に必要なもの。それを出さないなんてリスクでしか無い。
想像ですが、『ログがユーザーに見えている。処理自体に問題はない。とりあえず消せ!』というとき、一番手っ取り早い方法で使うんでしょう。
ただこれは問題の解決になってないし多用されると本当に困ります。
使ってはいけないと言いましたが使ってもいいです。ただし、あとで必ず外してソースに残さないという前提で。
とりあえず暫定措置で@演算子を使い、根本解決をして終わったら外すという使い方。
エラーを抑制できるのは式だけ
エラー制御演算子の@の使い方はかんたんです。式だけに付けることができます。サンプルコードで見てみましょう。
変数
同じ変数で片方だけに@を付けてログの抑制を確認します。
2行分の通知ログがあるはずですが、4行目は抑制されて出ません。
関数
まずは標準関数につけてみます。
今度は自作関数で実行してみます。ログレベルをエラーに上げて見るために、まずは@を使わないところから。
これに@を使ってみましょう。
ね? ヤバいでしょ? 致命的なエラーになって処理が途中で終わっているのに、何が起きているのかさっぱり分かりません。
この仕様はPHP8では修正されています。PHP8では、Fatal Errorは@を付けてもログを出すようになっています。
今度は未定義の関数で実行してみます。
未定義の関数はログが出ました。理由は正確には例外エラーだから。Exceptionを継承した例外クラスがスローするログは@を付けても出力されます。
(PHP8より前でも。このサンプルはPHP7で実行。)
クラス
クラスオブジェクトで見てみましょう。クラスではエラーは例外を使うのがスタンダードなので、基本的には@演算子は効きません。
インスタンス生成ではnewの前に@を付けます。クラス名の前につけるとシンタックスエラーになるので注意。
今度はクラスの中で、ログ出力をしてみます。エラーログを使う人はいないので(例外を使う。)、警告を出してみます。
警告なので処理は続行します。@演算子を付けてみます。
ログ抑制はできましたが、何が起きているのかさっぱり分かりません。
ダイレクトにログ抑制
最後に、trigger_error()に直接@を付けます。もちろんこれでも抑制ができます。
@演算子がついた '2' だけが抑制されているのが分かります。