まちゅダイアリー
2005-07-10 (日)
■ PHPと格闘
この週末は、PHP とずっと格闘していた。 ほとんど PHP でプログラムを書いたことが無いのも悪いんだけど、どうでもいいところで30分くらい行き詰ってしまう。
たとえば…
$arr = array(10, 20, 30, 40);
foreach($arr as $value) {
$value += 1;
}
と書いても配列の中身が変わらないところ。 調べてみると、 foreach は値渡しなのが原因みたい。
$arr = array(10, 20, 30, 40);
foreach($arr as $key => $value) {
$arr[$key] = $value + 1;
}
このように、キーを使って元の要素を直接修正しなきゃいけない。
一番参ったのは…
$var = 0; print ($var == 'string') ? 'true' : 'false'; // 結果は「true」
この結果が「false」じゃなくて「true」になる。え? $var は 'string' じゃないのに…。 「0」以外だと「false」と判定されるんだけど、何が悪いのかずっと分からなかった。
$var = 0; print ($var === 'string') ? 'true' : 'false'; // 結果は「false」
このように、「===」を使って比較してあげないとダメみたい。 でも、いまだに理由は理解してない。
PHP5 でだいぶ改善されているらしいけど、互換性の問題からまだまだ安心しては使えないんだよね。 でも、趣味じゃ PHP4 はできないなぁ…。
'string'==0 は予想外ですよねぇ。PHP5でもそのままですよ。<br>理由は「比較演算子が数値と文字列の場合は数値に統一される+数値として読めない文字列は0に変換される」の合わせ技です。<br>http://d.hatena.ne.jp/nazoking/20050413/1113335258
Perlでも同じですね。<br>$var = 0;<br>if ($var == 'string') {<br> print "true";<br>} else {<br> print "false";<br>}<br>これはtrueと表示されます。文字列比較は、==ではなくeq。
素直に納得できました。ありがとうございます。<br>Perlでのeqは馴染み深かったんですが、PHPには無いので油断してました。無い理由をちゃんと考えないとダメでしたね。
あっ、PHPにはeqがないんですね。なるほど…。たしか、JavaScriptには===がありますね。役割はよく知りませんが。
===は暗黙の型変換を行わない比較ですよ<br>基本的に暗黙の型変換は動作の予測が困難(冒頭はPHPの例だけど、どの言語でも言える)でソースコードが見辛くなるんで使わない方が良いと思います。<br>明示的な型変換に比べて実行時のコストも増えたはず<br><br>c#は暗黙の型変換を使用不可にしてバグの介入を予防している。<br>最初は面倒だったけど、こういうのを見るとなるほどなぁと思った。