そういやすっかり忘れてたよねぇ的小ネタ。
<?php function hoge() { return true; } $b = false; $b = hoge() and $b; var_dump($b);
これを動かすと、falseとtrueとの演算なんで…実はtrueになります。
理由は簡単で、演算子の優先順位の問題。
http://jp1.php.net/manual/ja/language.operators.precedence.php
演算子「and」は、代入式よりも「後で」実行されるので。
結果的に「まずhoge()の結果が$bに代入されて」「その後で、andの論理演算が走る」ざんす。
…すっかり忘れてて、15分くらいはまりました orz
優先順位的に高い&&を使うと、一瞬で解決します。
<?php function hoge() { return true; } $b = false; $b = hoge() && $b; var_dump($b);
これなら代入より前に&&の論理演算子が動くので、無問題。
ちなみにもう一つ、小ネタ。
<?php function hoge() { echo "Trap\n"; return true; } $b = false; $b = $b && hoge(); var_dump($b);
これで確認をすると解るのですが。「$b &&」の時点でfalseって解ってるから「hoge()は呼ばれません」。
細かいところではあるんだけど。
今回のケースだと「いくつかのオブジェクトに対して順次validationをかけて、どこかでfalseになってれば」って段組を下ろしているところで引っかかった頭痛ネタ orz
こーゆー小さなのって、原理が解ってれば気づくんだけど、原理を知らないとドはまりすることがあるから、みんなも要注意だぞ!!
# 思いっきり「自戒」とも言う orz