2009-07-19 13 views
7

私はまだ割り当てられていない変数だけを割り当てたいです。次のようなPHPの方法は何ですか?PHPには、|| =演算子と同等のものがありますか?

$result = null; 
$result ||= check1(); 
$result ||= check2(); 
$result ||= "default"; 

私はstandard operatorsis_null機能をチェックしますが、上記の操作を行うための簡単な方法があるようには思えません。

if (!isset($blah)) { 
    $blah = 'foo'; 
} 

注:あなたが変数にnullを割り当てることができ、それが割り当てられます

答えて

17

isset()は、これを行うための通常の方法です。 isset()is_null()で異なる結果が得られますので、「割り当てられていない」ということを明確にする必要があります。 Null vs. isset()を参照してください。これは、自動タイプ変換の実行に注意する必要がある場合もあります。つまり、目的の結果に応じて!=/==または===/!==を使用することを意味します。

これにブール代数式を使用することもできます(これはPerl ||=演算子です)。 PHP 5.2.x以降、あなたが話すような演算子はありません。 Perlでは:あなたはPHPで二番目の形式を行うことができますが、PHPはtype jugglingに関するいくつかのファンキーなルールがあり

$a = $a || $b; 

$a ||= $b; 

は同等です。 Converting to boolean参照:

booleanへの変換、 以下の値が考慮されるFALSE:

  • booleanFALSE自体
  • integer 0(ゼロ)
  • float 0.0(ゼロ)
  • 空のstringおよびstring "0"
  • arrayゼロの要素
  • objectゼロのメンバ変数(PHP 4のみ)
  • NULL(未設定変数を含む)特殊なタイプの空のタグから作成
  • SimpleXMLオブジェクト

他のすべての値はTRUE(すべてのリソースを含む)とみなされます。

だから、後:

$a = 0; 
$a = $a || 5; 

$同様に5に等しくなる:

$a = 0; 
$b = ''; 
$c = $a == $b; // true 
$d = $a === $b; // false 

あなたはこれらの事に注意しなければなりません。

+1

$ a = isset($ a)? $ a:$ b;最初のコードサンプルの略語です – niteria

+0

$ a = 0; $ a = $ a || 5; echo $ a; // boolean TRUE – eyelidlessness

+0

奇妙なことに... echo $ a == 5? '正誤'; // true - but - echo $ a - 1; // 0 – eyelidlessness

0

いくつかのネストされた三項演算子を使用することはどうですか?

私にとっては、あなたの問題に対処する最も簡単な方法です。ネストされた三項演算子を使うことができるので、必要に応じてチェックを追加することができます。

$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

それはほとんど同じコードの量だと、私はあなたを誤解していない限り、それは...動作するはずです。それが事実なら、私は残念です。

:あなたは、コメントでそれを持っているので、ここでは、

$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default"; 
- vs - 
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ; 

ネストされた三項演算子は少し混乱することができます:あなたは一例として掲載元のコードと比較して

は、長さがほぼ同じです

// Is $var set? 
    $var = isset($var) ? 
     // TRUE: It is, use $var 
     $var : 
     // FALSE: $var is not set, run check1 
     ($i=check1()) ? 
     // TRUE: the function check1 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, run check2 
     ($i=check2()) ? 
     // TRUE: the function check2 returned valid data 
     $i : 
     // FALSE: the function check1 returned null or false, set default value 
     "default" ; 
+1

ネストされた三項演算子は、 'UnreadableOverflowException'になります。 – Dan

14
isset($foo) || $foo = 'bar'; 
+1

これはクールです。それは明らかですが、私はそれを試みることは決して考えなかったでしょう。 – eyelidlessness

0

私はまだ試していませんが、年齢はPECL Operatorで遊んでいました。

5

PHP 5.3からは、使用することができます。

$result = $result ?: check1(); 
1

が、私は役に立たない未定義の変数の通知を塞ぐの副次的な利点があります。この機能を思い付きました。私にとってJavascriptの動作には十分に近いです。

function default_value(&$var, $default) { 
    return isset($var) ? $var : $default; 
} 

$want_something = default_value($_POST['mightbeunset'], false); 
関連する問題