トップ «前の日記(2005-07-08 (金)) 最新 次の日記(2005-07-18 (月))»  

まちゅダイアリー


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 はできないなぁ…。

Tags: Life
本日のツッコミ(全5件) [ツッコミを入れる]
nazoking (2005-07-11 (月) 04:56)

'string'==0 は予想外ですよねぇ。PHP5でもそのままですよ。<br>理由は「比較演算子が数値と文字列の場合は数値に統一される+数値として読めない文字列は0に変換される」の合わせ技です。<br>http://d.hatena.ne.jp/nazoking/20050413/1113335258

hyuki (2005-07-11 (月) 07:49)

Perlでも同じですね。<br>$var = 0;<br>if ($var == 'string') {<br> print "true";<br>} else {<br> print "false";<br>}<br>これはtrueと表示されます。文字列比較は、==ではなくeq。

まちゅ (2005-07-11 (月) 09:57)

素直に納得できました。ありがとうございます。<br>Perlでのeqは馴染み深かったんですが、PHPには無いので油断してました。無い理由をちゃんと考えないとダメでしたね。

hyuki (2005-07-13 (水) 04:46)

あっ、PHPにはeqがないんですね。なるほど…。たしか、JavaScriptには===がありますね。役割はよく知りませんが。

kenz (2007-06-06 (水) 08:31)

===は暗黙の型変換を行わない比較ですよ<br>基本的に暗黙の型変換は動作の予測が困難(冒頭はPHPの例だけど、どの言語でも言える)でソースコードが見辛くなるんで使わない方が良いと思います。<br>明示的な型変換に比べて実行時のコストも増えたはず<br><br>c#は暗黙の型変換を使用不可にしてバグの介入を予防している。<br>最初は面倒だったけど、こういうのを見るとなるほどなぁと思った。