• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件文について)

PHPの条件分岐について考える

このQ&Aのポイント
  • PHPの条件分岐について考える。簡単な構文でも必要以上に使われ、複雑に見えることがある。
  • 初学者が条件分岐を少なくする方法を考えた場合、簡潔に書くことができる。
  • 条件分岐を多く使うかどうかは必要に応じて判断するべきであり、詳細に分けることで制御を細かく行うことができる。

質問者が選んだベストアンサー

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

コンピュータは「利口な新人」と思ってください。 ファイルオープンに失敗したら? ファイルロックに失敗したら? 書き込みに失敗したら? など、事細かく指示してやらなければ何もできないのです。 たとえば、あなたが「コーヒー買ってきて」と頼まれるとします。 あなた、この一言で買い物ができますか? ホットなのかアイスなのか ブラックなのか どこの自販機なのか 銘柄は?売り切れの場合は別の銘柄でも良いのか? など、確認しなければならないことは山ほどありますよね。 それを事細かく指示してやらないと、困ってしまいます。 コンピュータで動いているソフト(プログラム)というのは 例外処理のほうが分量が多いかもしれません。

okdayook
質問者

お礼

そうですね。 いくらコンピュータでもプログラムがなければ 人間のように自分で状況判断して選択することはできないですよね。 よく分かりました。 ありがとうございました!

その他の回答 (3)

noname#244856
noname#244856
回答No.4

fwrite関数のマニュアルより補足します。 http://jp2.php.net/fwrite 注意: fopen() を使用して追記モードでオープンした handle の場合、 fwrite() はアトミックになります (ただし、一部のプラットフォームにおいて string がファイルシステムのブロックサイズを超えない場合、 そしてローカルファイルシステム上のファイルである場合に限ります)。 アトミックであるとは、つまり fwrite() をコールする前にリソースを flock() する必要がないということです。データの書き込みが中断されることはありません。 今回はaモードでオープンしているのでロックする必要すらないようですね、これは私も初めて知りました…

okdayook
質問者

お礼

ありがとうございました!

noname#244856
noname#244856
回答No.3

・最初の方のemptyを用いているチェックは処理とは直接関係ないようなので省きます。 ・fopenのコールに失敗すると画面にWarningが出力されてカッコ悪くなるので、@演算子で表示を抑制します。 ・bモードを用いてオープンしないと改行コードが勝手にOSに合わせて変換されるのでこれを回避します。 ・ロックが失敗する可能性があるのはLOCK_NBを用いている場合に限定されるので今回は省くことが出来ます。 ・HTTP経由でなければロックを確保したファイルにfwriteが失敗することはあり得ないので今回は省くことが出来ます。 以上を踏まえると if ($fp = @fopen('keijiban.txt', 'ab')) {  flock($fp, LOCK_EX);  fwrite($fp, $data);  flock($fp, LOCK_UN);  fclose($fp); } else {  $error = error_get_last();  echo 'エラー発生: ' . $error['message']; } これぐらいでいいんじゃないですかね。「if文で返り値をチェックしなければならない」のが嫌であればオブジェクト指向で書けるSplFileObjectを採用すればいいと思います。 PHP Manual - 例外 http://www.php.net/manual/ja/language.exceptions.php PHP Manual - SplFileObject http://www.php.net/manual/ja/class.splfileobject.php try {  $file = new SplFileObject('keijiban.txt', 'ab');  $file->flock(LOCK_EX);  $file->fwrite($data);  $file->flock(LOCK_UN);  unset($file); } catch (RuntimeException $e) {  echo 'エラー発生: ' . $e->getMessage(); } (なお、インデントには全角スペースを使用しましたのでそのままコピペをする場合は適宜直してください)

okdayook
質問者

お礼

いつもアドバイスありがとうございます。 オブジェクト指向も少し見てみましたが 違うプログラム言語のように さっぱり分かりませんでした。 進歩がないわりには課題が多すぎて なかなか思うように勉強が進みません。 がんばります。

回答No.2

残念ながら、「同じ内容の構文」にはなっていません。 あなたがお書きのもので、エラーが拾えるのは、「名前がない」「中身がない」というだけですよね。 ・掲示板のファイル名を間違えていた ・掲示板をロックしようとしたら、失敗した。 ・なんか、書き込みに失敗した(ハードディスクがいっぱいの場合もあるし、故障の場合もある) こういうケースで、正常に動いたように見えて、実は書き込みができてない。 ロックに失敗したまま書き込んだとしたら(システム上で止められるかもしれませんが)他の書き込みを壊すかもしれない。 そういうことが発生したのを知るには、少なくとも(別に分岐する必要は無いのですが)すべてのエラーをは把握しておく必要があります。 また、ロックできなければ書き込みはしてはいけないという、「やってはならない」というも場合もあります。 そういうことを踏まえて、必要なだけエラー処理を行う必要があるだけで、「できるだけ多く使う」必要はありません。

okdayook
質問者

お礼

ご回答ありがとうございます。 構文はまずエラーの可能性を考えながら 結果を導き出すということが大事なのですか。。。 PHPの勉強初心者にはそこが一番難しいのかも しれません。

関連するQ&A