2011-10-05 10 views
6

私はコーディングの忍者h4xのスキルを向上させようとしていますが、現在はさまざまなフレームワークを検討しています。PHPのAND演算子による短絡評価

私はプロジェクトで使用されているFUEL frameworkを見ています。

私は理解していないサンプルが

$data and $this->template->set_global($data); 

キーワードのコード行で何をしているのですか?それはフレームワークの多くの場所で使用されており、私が最初に使用していることがわかりました。

答えて

12

これは「short circuit evaluation」のタイプです。 and/&&は、比較の両側がTRUEに評価されなければならないことを意味します。

and/&&の左側の項目はTRUE/FALSEと評価され、TRUEの場合は右側の項目が実行され評価されます。左のアイテムがFALSEの場合、実行は停止し、右側は評価されません。

$data = FALSE; 
// $this->template->set_global($data) doesn't get evaluated! 
$data and $this->template->set_global($data); 

$data = TRUE; 
// $this->template->set_global($data) gets evaluated 
$data and $this->template->set_global($data); 

注これらは実際のブールTRUE/FALSEである必要はありませんが、また、PHPの評価ルールに従ってtruthy/falsy値にすることができます。評価ルールの詳細については、PHP boolean docsを参照してください。

+0

完璧な答え<3 –

+0

+1。 FUELは実際には '&&'を使用するべきです。 –

2

それは有効な文であり、このように動作します:その後の$ this - >テンプレート - > set_global($データ)を実行$データが有効であれば

( '' ではありません、0またはNULL)

それは言っての簡単な方法です:

if ($data) 
{ 
    $this->template->set_global($data); 
} 

ところで、あなたも&&代わりのand

を使用することができます
+0

間違っていれば、 '||'を使うと、左側が真実でない場合にのみ右側が評価されます。 – igorw

+0

それは&&ではない||私はそのthoのポイントを削除しません:P –

+0

かなり右。私が思う>私が思う>< – Tom

-2

boolean operatorです。つまり、2つのオペランドをとり、ブール値 - trueまたはfalseを返します。両方のオペランドがtrue(PHPでは空文字列、0またはnull)と評価された場合はtrueを返します。そうでない場合は結果がfalseになります。

はここandオペレータにPHPの公式ドキュメントです:あなたは論理演算子を使用する場合http://www.php.net/manual/en/language.operators.logical.php

<?php 
$a = true and false; # FALSE 
$b = true and 5; # TRUE 
$c = '' and 0; # FALSE 
$d = null and true; # FALSE 
?> 
+0

あなたは質問を誤解しました –

4

は、オペランド(左と右の値の値)は、ブールとして評価されているので、基本的にそのコード短い方法で、これを行います。

$o1 = (Bool)$data; // cast to bool 
if($o1) 
    $o2 = (Bool)$this->template->set_global($data); // cast to bool 

編集:

いくつかの追加情報:

$a = 33; 
isset($a) && print($a) || print("not set"); 
echo "<br>"; 
isset($a) AND print($a) OR print("not set"); 
echo "<br>"; 

$a = 33;をコメントしてみてください。これは&&ANDの間の差であり、||ORの間です(printは、文字列に変換されたときにキャストされるtrueを返します)。

0

PHPは、論理AND演算のための両方&&andサポートしており、それらは一般and除いて、同じように動作してい&&よりも若干低い演算子の優先順位:http://php.net/manual/en/language.operators.precedence.php

+0

あなたは質問を誤解しました –

+0

質問に直接は触れませんが、優先順位の違いについては+1します。 –

関連する問題