2009-10-08 20 views
20

一部の言語では、あなたはそれが真の値が見つかるまで左から右にORは、短絡、値のみを評価しますですPHPに一番左の値を返す短絡ORがありますか?

$a = $b OR $c OR die("no value");

を行うことができます。また、trueではなく、と評価された実際の値が返されます。

いずれか$a又は$b非偽の値である場合は、上記の例では、PHPで、$a1であろうが、またはそれがあろうdie

そこで$a又は$bいずれかのを返し

$a = first($a, $b, die("no value"));

として使用する機能firstを作成しました。しかし、それは短絡しません - それはいつもdieです。

PHPに実際の値を返す短絡回路ORはありますか?

編集: いくつかの良い私が与えた例の答えが、私は私の例は、私が何を意味するのか、正確ではないと思います。私を明確にしましょう。これらの機能のそれぞれが本当に強烈計算を行いますので、私はせいぜい一回、各式を評価したい

$a = func1() OR func2() OR func3();

。そして最初に真の値を返すために、私は$aに実際の値を格納したいと思います。

私は、短絡しないので、関数の書き方を除外することができます。条件付き演算子の答えは各式を2回評価します。

+2

これはもちろん、常に死ぬでしょう。関数を呼び出すときには、まずすべてのパラメータを評価する必要があります。評価中、「死ぬ」(「値なし」)と見なされます。 – Tom

+1

変数について話していたとき、各式を2回評価するのは問題ありませんでした。あなたは最初にあなたの質問を綴る必要があり、初めて利用できなかった追加の情報を提示した後、答えを批判しないでください。関数を意味する場合は、初めて関数を使用してください。最善の答えはカオスの「いいえ」です –

+1

コメント#2が間違っています。 phpは短絡評価を持っていますが、AFAIKは一番左の値を返しません。常にブール値を返します。 – apinstein

答えて

10

あなただけ使用することができます。

$a = func1() or $a = func2() or $a = func3(); 

または私は何かが足りないのですが?

+0

私が探していたものとまったく同じものではありませんが、それはきれいで、動作します。ありがとう。 – Steve

+16

十分に汚れた "クリーン"値の場合。 – chaos

+3

私は答えをupvoteしますが、私は言語をdownvoteすることができればいいです –

28

私の意見では、Rasmus Lerdorfが無能な開発者のために有能な開発者を最も邪魔するPHPの設計で作った悪い決定の一つではありません。

編集:PHP 5.3以降では、$a = $b ?: $c、さらに$a = $b ?: $c ?: $dと書くことができます。それでも、脳が損傷していない論理演算子ほど良くはありませんが、それは何かです。

+3

?:構文がIMHOで完全に読めません。ショートサーキットはそれほど優れているとは言えませんが、それは比較できません。/ –

+6

私からは何の議論もありません。 – chaos

2

あなたはcoalesce functionのいくつかの種類使用することができます:変数関数について

function coalesce() { 
    foreach (func_get_args() as $arg) { 
     if ($arg) { 
      return $arg; 
     } 
    } 
    return null; 
} 

$a = coalesce($a, $b) or die("no value"); 
+0

これは、正しく動作する論理演算子のセットと完全には等価ではありません(複雑な式や関数呼び出しを短絡させることはできません。 – chaos

+1

これはいいですが、真の短絡ORとは異なり、合体する各引数を評価します。たとえば、coalesce(true、launch_missiles())またはdie( "end is near")は、ミサイルが発射されることになります。 – Shawn

1

何を?

function coalesce($funcs) 
{ 
    foreach ($funcs as $func) 
    { 
     //Catch language constructs 
     switch($func) 
     { 
      case 'die': 
       die(); 
     } 
     $result = $func(); 
     if ($result) 
     { 
      return $result; 
     } 
    } 
} 
0

この動作するはずです:

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ? $f2 : func3())); 
1

すみませんが、これらの答えのほとんどはちょうどオフになっています。

$ a = $ b OR $ c OR die( "値なし");

$a = $b ?: $c ?: die("no value"); 

理由になったり、動作しない代わりに、代わりに元または後者の値を返すことは、trueまたはfalseを返すということです。

関連する問題