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 "エラー";
}
-----------------------------------------
条件分岐をできるだけ多く使うことは
必要なのでしょうか?
条件分岐で詳細に分けるのは
どのような利点が具体的にあるのでしょうか?
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
コンピュータは「利口な新人」と思ってください。
ファイルオープンに失敗したら?
ファイルロックに失敗したら?
書き込みに失敗したら?
など、事細かく指示してやらなければ何もできないのです。
たとえば、あなたが「コーヒー買ってきて」と頼まれるとします。
あなた、この一言で買い物ができますか?
ホットなのかアイスなのか
ブラックなのか
どこの自販機なのか
銘柄は?売り切れの場合は別の銘柄でも良いのか?
など、確認しなければならないことは山ほどありますよね。
それを事細かく指示してやらないと、困ってしまいます。
コンピュータで動いているソフト(プログラム)というのは
例外処理のほうが分量が多いかもしれません。
そうですね。
いくらコンピュータでもプログラムがなければ
人間のように自分で状況判断して選択することはできないですよね。
よく分かりました。
ありがとうございました!
No.4
- 回答日時:
fwrite関数のマニュアルより補足します。
http://jp2.php.net/fwrite
注意:
fopen() を使用して追記モードでオープンした handle の場合、 fwrite() はアトミックになります (ただし、一部のプラットフォームにおいて string がファイルシステムのブロックサイズを超えない場合、 そしてローカルファイルシステム上のファイルである場合に限ります)。 アトミックであるとは、つまり fwrite() をコールする前にリソースを flock() する必要がないということです。データの書き込みが中断されることはありません。
今回はaモードでオープンしているのでロックする必要すらないようですね、これは私も初めて知りました…
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 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();
}
(なお、インデントには全角スペースを使用しましたのでそのままコピペをする場合は適宜直してください)
いつもアドバイスありがとうございます。
オブジェクト指向も少し見てみましたが
違うプログラム言語のように
さっぱり分かりませんでした。
進歩がないわりには課題が多すぎて
なかなか思うように勉強が進みません。
がんばります。
No.2
- 回答日時:
残念ながら、「同じ内容の構文」にはなっていません。
あなたがお書きのもので、エラーが拾えるのは、「名前がない」「中身がない」というだけですよね。
・掲示板のファイル名を間違えていた
・掲示板をロックしようとしたら、失敗した。
・なんか、書き込みに失敗した(ハードディスクがいっぱいの場合もあるし、故障の場合もある)
こういうケースで、正常に動いたように見えて、実は書き込みができてない。
ロックに失敗したまま書き込んだとしたら(システム上で止められるかもしれませんが)他の書き込みを壊すかもしれない。
そういうことが発生したのを知るには、少なくとも(別に分岐する必要は無いのですが)すべてのエラーをは把握しておく必要があります。
また、ロックできなければ書き込みはしてはいけないという、「やってはならない」というも場合もあります。
そういうことを踏まえて、必要なだけエラー処理を行う必要があるだけで、「できるだけ多く使う」必要はありません。
ご回答ありがとうございます。
構文はまずエラーの可能性を考えながら
結果を導き出すということが大事なのですか。。。
PHPの勉強初心者にはそこが一番難しいのかも
しれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- C言語・C++・C# c言語 1 2022/11/09 13:05
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
- フィナンシャルプランナー(FP) FP相談に、本人確認は必須ですか? 3 2022/04/25 11:03
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
XMLのロードに失敗する
-
TSVファイルをCSV形式に変換したい
-
onedrive にexcelファイルをア...
-
Fedoraでphp
-
【file_exists】ファイルが存在...
-
ImageCreate関数が undefined f...
-
フォントの色を変えるには?
-
別ファイルの変数を呼び出した...
-
インスタンス化に伴うメモリ消...
-
error_reporting(0);にも関わら...
-
MySQLのdatetime型の月日0を削...
-
httpdのプロセスが自動で消えな...
-
<A href ~ と一緒に値を渡すには
-
wgetの使い方
-
CygwinでNo such file
-
SSI される .inc ファイル内に ...
-
ワードプレスサイト PHP8.0.25...
-
.phpと.incファイルの違いはな...
-
phpにて動的なページを生成する...
-
Matlab 指定したディレクトリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPでFilename cannot be empty...
-
2つの画像ファイルが異なるファ...
-
phpのftp_get()でエラーが出ます。
-
ファイルの行数取得
-
stat failed
-
ファイル名は、数字の「0」(...
-
XMLのロードに失敗する
-
日本語が文字化けしないよう読...
-
shift-jisでfgetcsv
-
Smartyで吐き出されたhtmlソー...
-
PHPでテキストファイルかどうか...
-
PHPでの別のサーバーのテキスト...
-
別のサーバにあるファイルの存...
-
値の取り出し方について教えて...
-
PHPでAPI 出力はCSVを取得する...
-
FirefoxでFormのfileでファイル...
-
PHPのファイル操作
-
Warning: preg_match_allの他に...
-
日本語のファイルが開けない
-
TSVファイルをCSV形式に変換したい
おすすめ情報