2011-11-07 14 views
7

私の目標は、複雑なロジックをif()ステートメントに入れることです。私は値の配列を持っていて、私の配列のすべてが0でないなら、少しのコードを実行するつもりです。通常、私は、$valid = trueforeach私の配列と言うことができ、0が見つかると$valid = falseと設定することができます。それからコードif ($valid)を実行します。あるいは、私のループを関数に入れて、関数intop my if()を置くこともできます。PHPのクロージャはIF文で何を返しますか?

しかし、私は怠け者だから、 "有効な"フラグがたくさん残っているのではなく、むしろ1つの場所で使用されている全く新しい機能を書くつもりはない。

それでは、私はこれを持っているとしましょう:

if ($q = function() { return 'foo'; }) { 
    echo $q; 
} 
else { 
    echo 'false'; 
} 

私は真と評価され、if'foo'を取得することを期待していました。私の閉鎖は$qにコミットされ、ステートメントが実行されます。 $qは文字列fooを返し、 'foo'が出力されます。

代わりに、エラーObject of class Closure could not be converted to stringが表示されます。

それでは、代わりにこれを試してみましょう:私は私の関数が印刷される偽と「真」戻ってくることを期待していた

if (function() { return false; }) { 
    echo 'foo'; 
} 
else { 
    echo 'true'; 
} 

を。代わりに 'foo'が表示されます。

私がこれについてどうやってやっているのですか?それは言っているようです、 "はい、確かに機能です!"代わりに "いいえ、関数がfalseに評価されたため。私がやろうとしていることをする方法はありますか?

+3

関数を戻り値と混同しているようです。 – delnan

+0

私が望むのは 'if(function(){return false;}()){'で、Javascriptでは明らかに有効ですがPHPでは有効ではないと思います。 – ajp5103

+0

http://stackoverflow.com/questions/3568410/anonymous-functions-that-execute-immediately call_user_func()は私が探していたものです。 – ajp5103

答えて

4

function() { return false; }次のコードを比較し、他のクラスタイプのnewと同様、タイプClosureのオブジェクトを作成します$funcは現在オブジェクトです。各オブジェクトはif句でtrueを返します。だから、

if ($func) 
{ 
    # true 
} else { 
    # will never go here. 
} 

あなたは代わりにこれを実行する場合があります

クロージャオブジェクト $funcを呼び出し、それの戻り値を与える
if ($func()) 
{ 
    # true 
} else { 
    # false 
} 

echo $q(); 
3

どちらも真と評価されます。

if文で使用するには、関数を実行する必要があります。

は、これを試してください

$q = function() { return false; }; 
if ($q()) { //should not go here. 
    echo $q(); 
} 
else { 
    echo 'false'; 
} 

デモ:

$func = function() { return false; }; 

http://codepad.viper-7.com/Osym1s

1

あなたは、このように、クロージャではなく、閉鎖の結果をプリントアウトしようとしている、閉鎖を実行していません。 $q = function() { return 'foo'; }をテストするときに、「$ qにこの匿名関数への参照を割り当て、$ qがnullでない場合にこのテストに合格する」というメッセージが表示されます(PHPの楽しみはありません)。

クロージャを実行し、結果を$qに割り当ててから、$qをテストしてエコーします。

0

あなたは無名関数を作成し、それを実行されることはありません:あなたはechoを呼び出すとき

2

PHPのクロージャは、タイプClosureのハックオブジェクトとして実装されています。あなたのコードは実際にこのクラスのオブジェクトをインスタンス化し、それを$ qに代入しています。 PHPでは、代入の結果は割り当てられる値なので、コードは実際には

になります。
if (new Closure()) { ... } 
関連する問題