質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

6回答

3240閲覧

@(エラー制御演算子)を使用について

intron

総合スコア36

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/05/25 12:41

PHP 5.6、Laravel5 で他人が作ったでシステムを改修することになりソースコードを読んでいる最中なのですが、

php

1if(@$input['hoge']==1)

とか

php

1$data = array("FUGAID"=>@$input["fugaid"]);

のような感じで連想配列の値を使っているところで "@"(エラー制御演算子)がたくさん出てきました。

自分は今までエラー制御演算子をほとんど使ったことがなく(エラー処理をちゃんと考えてなかった^^;)、
また、ググると「エラー制御演算子は使うべきではない」という意見と
「使い方が間違ってなければ使ってもいいんじゃないの」という意見があるみたいで、
直すべきかどうか迷っています。
エラー演算子を使うのをやめるなら

php

1if (isset($input['hoge']) && $input['hoge']==3) {

か、あるいは例外をcatchするかどちらかかなあと思うのですが、
エラー制御演算子を使っているところが結構多いので
「この@の使い方なら問題ない」というならそのままで行きたい気もしています。
識者の方のご意見を伺いたいと思います。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

あちゃー,つらいコードですね…バグがあってもなかなか見つけにくいやつだ…
ただ実務的な観点から回答すると,

  • 既存のシステム改修であれば無理して直さなくてもいいです。読めないほどのクソコードでなければそのままでもどうにでもなるでしょう。
  • ほとんどゼロから書き直す機会か,時間に余裕ができたときにはマズい記述を一掃しましょう。他にやるべきことがあるときに優先して対応すべき項目ではありません。

投稿2017/05/25 14:53

mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mpyw

2017/05/25 14:56

Laravelの場合はset_error_handlerで全部のエラーをErrorExceptionに変換するようになっていると思いますが,「未定義でもNULLとしてそのまま動いて欲しい」という意図があってわざと @ がついているんだと思います。
intron

2017/05/26 11:41

とりえあす@はそのままにしておくことにしました。あまり工数もないので。 @だけじゃなく全般的にヤバそうなコードで読んでるだんだん不安になってくるので 指示された障害修正と機能追加だけやってとっとと忘れようと思います^^; アドバイスありがとうございました。 他の回答者の皆様もありがとうございました。
guest

0

PHP 7であれば、配列の取得に@を使う必要性は、ほぼありません。??という強力な味方がいます。

if(@$input['hoge']==1) if(($input['hoge'] ?? 0) == 1) $data = array("FUGAID"=>@$input["fugaid"]); $data = array("FUGAID"=>($input["fugaid"] ?? null));

なお、@file_get_contents@unlinkのように、「失敗したらE_WARNING」という関数を、失敗しうる場面で使う場合には、「それしか手段がない」です。

投稿2017/05/25 12:58

編集2017/05/25 12:59
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

intron

2017/05/25 13:41

残念ながらPHP 5.6です;;
guest

0

ファイルI/Oとかに使うことはあるけど
ここで例示されてるようなやつには
(自分だったら)使わないなあ。

ちなみに、$_POST['hoge'] とかならともかく
普通の変数が設定されているかどうか
チェックしなきゃいけないってのも
なんか間違ってる気がします。

投稿2017/05/25 12:54

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

製造の途中でとりあえず動かすために使うことはありますが、最終的には出ないように改修し、全て取っ払います。
それはなぜかというと本来出るべきエラーも出なくしてしまいますし、そのあとの処理に悪影響を及ぼすケースもあるからです。

少し古いですが、下記記事のような考え方ですね。
http://sotarok.hatenablog.com/entry/20090721/1248112106

投稿2017/05/25 12:46

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答をみると反対派が多いのかなと思いますが、個人的には見やすくていいと思います。

変数またはキーが無いときにはNULLになって欲しいという意図は伝わるんじゃないでしょうか。
この程度ならコーディングルールの一つと思って合わせて書きます。

http://php.net/manual/en/language.operators.errorcontrol.php

投稿2017/05/26 05:52

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

個人的には@反対派です
基本的には三項演算子で書けば良いと思いますが
やはり面倒でしょうか?

if(@$input['hoge']==1)
↓↓↓
if((isset($input['hoge'])?$input['hoge']:null)==1)

とか
$data = array("FUGAID"=>@$input["fugaid"]);
↓↓↓
$data = array("FUGAID"=>isset($input["fugaid"])?$input["fugaid"]:null);

投稿2017/05/25 13:13

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問