2017-12-16 17 views
0

私は次のようにそれらをテスト奇妙な結果を得たVARS $a, $b, $c空()分離はどのように機能しますか?

if (empty($a . $b . $c)) {echo 'empty.dot';} 

if (empty($a && $b && $c)) {echo 'empty';} 


if (!empty($a . $b . $c)) {echo 'filled.dot';} 

if (!empty($a && $b && $c)) {echo 'filled';} 

でこれらif statementsempty()と機能を持っている:

case[1]: 
$a = '1'; 
$b = '1'; 
$c = '1'; 
result: 
fillted.dot, filled 

case[2]: 
$a = '1'; 
$b = ''; 
$c = '1'; 
result: 
empty, fillted.dot 

case[3]: 
$a = ''; 
$b = ''; 
$c = ''; 
result: 
empty.dot, empty 

何私は理解していないこと

なぜですcase[2]私は両方を持っていますempty($a && $b && $c)!empty($a . $b . $c) = TRUE

+2

'isset()'のみが 'empty()'ではなく、複数で動作します。 –

+0

@FunkFortyNinerしかし、なぜそれは 'case [1]、[3]'に有効な結果をもたらしますか? – Matheo

+0

'empty 'の中の式が何を評価するかによって決まります。ドットは「111」、「11」、または「 '」のいずれかに連なっています。最後のものだけが空とみなされます。論理 '&& 'を使うと、真、偽、偽と評価されます。これらの行に '$ d = $ a && $ b && $c; var_dump($ d);'と '$ e = $ aを追加すると、 $ b。 $ c; var_dump($ e); 'ifsの上に、私が意味するものが見えます。 – Jeff

答えて

2

emptyは、その中にスタッフィング表現を気にしません。振る舞いをより明白にするために、どちらもしないでください。彼らが実際に何をするかにあなたの表現を分割:

$and = $a && $b && $c; 
$cat = $a . $b . $c; 

var_dump(empty($and)); 
var_dump(empty($cat)); 

そして、なぜ

  1. (1 && "" && 1)それはかなり明らかだがFALSEであり、したがってempty(FALSE)TRUE
  2. !empty("11")戻りTRUEです。
1

empty機能(または機能に似た機能)では、使用したさまざまな変数が表示されません。任意の関数のように、それはあなたが合格した単一の値を見て

だから我々は最初の式を見てする必要があります。

$a && $b && $c 

これはブールとして、各変数を扱い、すべての場合trueに評価します3つの値がtrue-ish、いずれかがfalse-ishの場合はfalseです。あなたが使用したテストケースでは、'1'は真として扱われ、''は偽として扱われます。

$a . $b . $c 

これは、各変数を文字列として扱い、長い文字列に連結します。

emptyがテストされている値を確認するには、var_dumpと置き換えてください。

関連する問題