gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

演算子の優先順位

そういやすっかり忘れてたよねぇ的小ネタ。

<?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