Oddwit


foreachで(僕が)よく引っかかる罠

Posted in PHP, Programming by マルコ on the February 12th, 2007

PHPで配列を扱うときは、中身をイテレートしてくれる foreach が必需品だ。

foreach ($var as $key=>$value){
	echo $value;
}

でもあまり無防備にコードを書いていると、それまでずっと機嫌よく動いていたスクリプトが突然醜いエラーを吐くことがある。

Warning: Invalid argument supplied for foreach() in index.php on line 3

これは $var が配列でなかった場合に起こってしまう。こういうコードを書くときは $var が必ず配列だと思い込んでいることが多いが、実際には特定の条件下で null だったりすることがたまにある。

そこで、foreach に配列を入れる際に必ず配列型かどうかをチェックしたほうがよい。

if (is_array($var)){
	foreach ($var as $key=>$value){
		echo $value;
	}
}

もしくは、配列型にキャストしてもよい。こちらの方がコードは読みやすい。

foreach ((array)$var as $key=>$value){
	echo $key." : ".$value;
}

ちなみに null を配列にキャストすると、空の配列になる。つまりそのまま何事も無かったかのように foreach をスルーできる。それ以外のものをキャストすると要素を一つだけ持った配列になるということも、キャストで foreach を使うなら覚えておいた方がいい。

DB::DataObjectがうまくいかない

Posted in PHP by マルコ on the October 8th, 2006

今日もさわやかな風が吹いていますが、僕は引きこもっています。こんにちは、マルコです。

何も考えずにデータベースからのデータの取得ができるようになるという、魔法のようなライブラリPEAR::DB_DataObjectと格闘してますが、うまくいかない。「あるテーブルからid=1のレコードを取得」ができない。あぁすばらしきライブラリ。

どうやらファイルの配置とパスの設定が食い違っているらしく、指定されたテーブル名に対応するクラスが読み込めないとのエラーが消えてくれません。
どう見ても合ってるようにしか見えない上に、エラーメッセージを見ただけでは具体的にどのパスのファイルを読み込もうとして失敗したのかが分からないという、大変性質(たち)の悪い状況に陥っています。デバッグできない。つまり遡ってやりなおすしかない。


今日学んだこと。何かが圧倒的に簡単になるものを作るなら、その導入も圧倒的に簡単である必要がある。デバッグのために出力するエラーメッセージでは、 想定したものと現実のものを両方記述してその差異を明らかにする必要がある。

« Previous Page