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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

2回答

611閲覧

エラー制御演算子(式への@追記)について(PHP)

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2020/07/10 10:12

編集2020/07/10 10:24

よろしくお願いいたします。

PHPバージョン: 7.4

phpリファレンスよりエラー制御演算子を調べておりましたが、

php式の前に@を記載した場合にその式は無視される

とあります。

こちらは、error_reporting(E_ALL)などで、エラー内容を表示させた際に、
@をつけた任意式にエラーが発生していても、エラー内容に反映されないということなのでしょうか。

例としてリファレンスより以下

php

1<?php 2/* 意図的なエラー */ 3$my_file = @file ('non_existent_file') or 4 die ("Failed opening file: error was '$php_errormsg'"); 5 6?>

上記のケースであれば、
@file ('non_existent_file')die ("Failed opening file: error was '$php_errormsg'");がありますが、

最初のエラー処理
1.@file ('non_existent_file')ではファイルが存在しないためE_WARNINGを返す処理
2.die ("Failed opening file: error was '$php_errormsg'")にて直近エラー文を任意文字とともに表示

の2通りのエラー表示があるかと思われますが、最初の行には@がふられているため、
2の処理のみ表示されるという認識で良いのでしょうか。

助言などいただけますと幸いです。

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

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

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

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

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

m.ts10806

2020/07/10 10:13

実際に組んで動かしてみれば明白かと思いますが、如何でしょうか。
m.ts10806

2020/07/10 10:14

あと、APCや排他制御は直接関係ないのでは?
m.ts10806

2020/07/10 10:15

あと、エラー出力についてはバージョンによって違ってくることもあります。想定のバージョンも提示された方が良いかとは思います(PHPマニュアルにも記載はあることはあります)
退会済みユーザー

退会済みユーザー

2020/07/10 10:16

Larevel上にて確認していたため、デフォルトでLaravelによるエラー表示がされてしまっておりました。 Laravelと無関係にブラウザで確認すれば良いのですが、なぜかphpファイルを作成してVSCODEよりブラウザ上で確認(ドラッグドロップで)しようとするとうまくいかなかったので質問させていただきました。 CODEPENなどで確認できるかもしれません、 ちょっと調べてみます。
guest

回答2

0

書き直すとこんな感じになります。

※全く一緒ではないですがイメージ

php

1if(@file ('non_existent_file')){ 2 $my_file = file ('non_existent_file'); 3}else{ 4 die ("Failed opening file: error was '$php_errormsg'"); 5} 6

そもそも論余程のことがない限り、使いません。
PHPマニュアルに警告が書いてありますね。

警告

現在、エラー制御演算子プレフィックス"@"は、スクリプトの実行を 終了するような致命的なエラーの出力さえ抑圧します。このため、ある関数の エラー出力を抑制するために "@" を使用した場合、その関数が 利用できなかったり、ミスタイプがあった場合でも、原因を示すことなく その場所でスクリプトは終了してしまいます。

ということもあり、エラー制御演算子の項から$php_errormsgを見ると、警告がありますね。

この機能は PHP 7.2.0 で 非推奨になります。この機能に頼らないことを強く推奨します。

つまり、質問者さんの環境であるPHPバージョン: 7.4では非推奨になっていることを指します。やがて削除される機能です。
5.2くらいからPHPを使ってる私ですが、@はともかく$php_errormsgについては自らの意思で使ったことは1度もないです。

制御しなければならないエラーは開発段階で極力洗い出して潰しておくべきですし、返却値がある関数はそれらを拾うとか別の機能で事前に担保しておくとか、Exceptionをthrowする機能であればtry-catchで拾うとか、むしろ積極的にエラーを拾って、問題解決に繋げる
こと
を覚えるべきかと思います。

今回で言えばfile()ファイルを配列に入れて返します。 配列の各要素はファイルの各行に対応します。改行記号はついたままとなります。 失敗すると file() は FALSE を返します。 ので、エラー制御演算子に頼らずともfalseが返ってきたら失敗と判断すれば良いのです。
ファイルが存在しない場合は E_WARNING レベルのエラーが発生します。 という説明書きがありますが、それならそもそもfile_existsで存在確認すれば「ファイルが存在しない場合は」という懸念を取り除いたうえで「ファイル読み込みの成功か否か」だけに注力したコードが書けるようになりますよね。

と言ったように、エラー制御演算子を使う必要性は、ないと言っても良いです。
ほとんどの機能において、安全に実行するための機能は十二分に整っています。

投稿2020/07/10 11:47

編集2020/07/10 11:49
m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2020/07/12 05:40

ご回答ありがとうございました、非常に勉強になります。 おっしゃる通り、非推奨とのことで確認不足でした。 file()もあまり使用したことがないのいですが、特定ファイル情報を配列形式で格納するのですね。 少し気になる点は、配列格納を行う際に単なる文字テキストが1行入ったファイルなどをfile()で格納すると、 1つの要素だけの配列になるだけなのでしょうか。 すみません、話が逸れてしまいましたが、アドバイスを参考に、こちらのエラー演算子よりtry-catchをしっかり学んでいきたいと思っております。 修正いただいた以下 if(@file ('non_existent_file')){ $my_file = file ('non_existent_file'); }else{ die ("Failed opening file: error was '$php_errormsg'"); } if(@file ('non_existent_file'))の箇所ですが、@マーク付きである場合は解釈としては non_existent_fileを読み込んだ場合という条件を@で否定しているということになるのでしょうか。 つまりifでのtrue条件はないものとして扱われるのかなという印象なのですが....
guest

0

ベストアンサー

1つ目が実行されてエラーが回避されますがfalseになるため
orで次のdieが実行されます

投稿2020/07/10 11:05

yambejp

総合スコア114572

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

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

yambejp

2020/07/10 11:06

@の処理はエラーが見つけづらくなるので、あまり推奨はされません 例外処理やアサーションで対応するのが普通です
退会済みユーザー

退会済みユーザー

2020/07/12 05:43

ご回答ありがとうございます! なるほどです。このorを使用した記述方法は if(){ } else { } を示しているのですね。 ただ、@マークをつける意味がいまいち理解できていません.... 自分の解釈では”@以降の式が無視される”という認識だったので、てっきりif条件式は無視される。 つまり、elseのdie()処理のみ実行される意味合いかと思っておりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問