dポイントプレゼントキャンペーン実施中!

PHPのサンプルを勉強していると
簡単な構文でも「if」などの条件文が
必要以上に使われ故意に複雑にしているように見えます。

--------------------------------------
if(!empty($name) || !empty($naiyou)){

$keijiban = "keijiban.txt";
$fp = fopen($keijiban, "a");

if($fp){
if (flock($fp, LOCK_EX)){
if (fwrite($fp, $data) === FALSE){
print "ファイル書き込みに失敗しました";
}

flock($fp, LOCK_UN);
}else{
print "ファイルロックに失敗しました";
}
}
fclose($fp);
}
-----------------------------------------

上記は正しいサンプル構文になるようで、
流れは大体理解できるのですが
そんなところまで条件分岐をしなくてはいけないのかな?
と思ってしまいます。

初学者の私が上のサンプルと同じ内容の構文を書くとしたら
以下のように条件分岐をできるだけ
少なくして考えてしまいます。

-----------------------------------------
if(!empty($name) || !empty($naiyou)){

$fp = fopen("keijiban.txt", "a");
flock($fp, LOCK_EX);
fwrite($fp, $data);
flock($fp, LOCK_UN);
fclose($fp);

}else{
print "エラー";
}
-----------------------------------------

条件分岐をできるだけ多く使うことは
必要なのでしょうか?
条件分岐で詳細に分けるのは
どのような利点が具体的にあるのでしょうか?

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

A 回答 (4件)

コンピュータは「利口な新人」と思ってください。



ファイルオープンに失敗したら?
ファイルロックに失敗したら?
書き込みに失敗したら?

など、事細かく指示してやらなければ何もできないのです。


たとえば、あなたが「コーヒー買ってきて」と頼まれるとします。
あなた、この一言で買い物ができますか?

ホットなのかアイスなのか
ブラックなのか
どこの自販機なのか
銘柄は?売り切れの場合は別の銘柄でも良いのか?

など、確認しなければならないことは山ほどありますよね。
それを事細かく指示してやらないと、困ってしまいます。

コンピュータで動いているソフト(プログラム)というのは
例外処理のほうが分量が多いかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/10 16:52

fwrite関数のマニュアルより補足します。


http://jp2.php.net/fwrite

注意:
fopen() を使用して追記モードでオープンした handle の場合、 fwrite() はアトミックになります (ただし、一部のプラットフォームにおいて string がファイルシステムのブロックサイズを超えない場合、 そしてローカルファイルシステム上のファイルである場合に限ります)。 アトミックであるとは、つまり fwrite() をコールする前にリソースを flock() する必要がないということです。データの書き込みが中断されることはありません。

今回はaモードでオープンしているのでロックする必要すらないようですね、これは私も初めて知りました…
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/10 17:06

・最初の方の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 Manual - SplFileObject
http://www.php.net/manual/ja/class.splfileobject …

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();
}

(なお、インデントには全角スペースを使用しましたのでそのままコピペをする場合は適宜直してください)
    • good
    • 0
この回答へのお礼

いつもアドバイスありがとうございます。

オブジェクト指向も少し見てみましたが
違うプログラム言語のように
さっぱり分かりませんでした。

進歩がないわりには課題が多すぎて
なかなか思うように勉強が進みません。
がんばります。

お礼日時:2014/03/10 17:05

残念ながら、「同じ内容の構文」にはなっていません。



あなたがお書きのもので、エラーが拾えるのは、「名前がない」「中身がない」というだけですよね。

・掲示板のファイル名を間違えていた
・掲示板をロックしようとしたら、失敗した。
・なんか、書き込みに失敗した(ハードディスクがいっぱいの場合もあるし、故障の場合もある)

こういうケースで、正常に動いたように見えて、実は書き込みができてない。
ロックに失敗したまま書き込んだとしたら(システム上で止められるかもしれませんが)他の書き込みを壊すかもしれない。

そういうことが発生したのを知るには、少なくとも(別に分岐する必要は無いのですが)すべてのエラーをは把握しておく必要があります。
また、ロックできなければ書き込みはしてはいけないという、「やってはならない」というも場合もあります。

そういうことを踏まえて、必要なだけエラー処理を行う必要があるだけで、「できるだけ多く使う」必要はありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

構文はまずエラーの可能性を考えながら
結果を導き出すということが大事なのですか。。。

PHPの勉強初心者にはそこが一番難しいのかも
しれません。

お礼日時:2014/03/10 17:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!