かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP if文の条件の判定順

if文の中に&&||で条件を複数入れた時にどちらから処理されるか、PHPは左からであってると思ったけど、何か右から判定するのが合った気がしたので念のため調べてみました。

次のような関数を作成して、この関数を条件にすれば、出力結果から左右どちらから処理をしているかが判ります。

<?php
function f($str) {
  echo $str;
  return true;
}

&& (AND)

<?php
if( f('A') && f('Z') );   // AZ
if( !f('A') && f('Z') );  // A
if( f('A') && !f('Z') );  // AZ
if( !f('A') && !f('Z') ); // A

左側から処理がされています。

|| (OR)

<?php
if( f('A') || f('Z') );   // A
if( !f('A') || f('Z') );  // AZ
if( f('A') || !f('Z') );  // A
if( !f('A') || !f('Z') ); // AZ

||も同様に左側から処理がされています。  
PHPのif文の条件は左から(先に書いた方から)されるで合っていました!
なので、条件が沢山あるif文を作成する時は、先にbool値だけで判定できるとか関数を呼ばない処理の軽いものから書いておけば計算量が減るということですね。

なんとなく記憶にある右から処理する言語って何だったか気になるところですが、
覚えている範囲だとプログラム言語ではない感じですが、
CSSセレクタを右から辿って検索する(ネストの深い所から上階層に向かって捜査)のでセレクタにタグ名を付けない方が高速というのがあります。

h1.logo /* 遅い */
.logo /* CLASSだけの方が速い */
#logo /* IDの方がCLASSより速い */

ef - a tale of memories. OPENING THEME〜euphoric field feat.ELISA

ef - a tale of memories. OPENING THEME〜euphoric field feat.ELISA