0

私は職場でこの問題に遭遇し、なぜPHPがこのように動作するのか疑問に思いました:

$test = "insert";

$isInsert1 = $test == "update";             // false
$isInsert2 = (boolean) ($test == "update"); // false
$isInsert3 = (boolean) $test == "update";   // true

$isInsert3 は、他の 2 つの変数と同様に false を返すはずですよね? 何らかの理由で、phpは $test 変数を「更新」文字列と比較する前に考慮していると思います。

その行動を誰かに説明してもらいたい。

4

5 に答える 5

5

3 行目では、(boolean) $test == "update"と解釈され((boolean) $test) == "update"ます。次に、PHP は空でない文字列が true であるため評価を試みtrue == "update"、右側が"update"true にキャストされるため、true になりtrue == trueます。

于 2013-10-21T19:27:43.357 に答える
2

ここでPHPが「見ている」もの:

最初:

$isInsert1 = $test == "update";             // false

<=> $isInsert1 = ($test == "update"); 
<=> $isInerst1 = ("insert" == "update");
<=> $isInerst1 = (false) // -> false.

2番目:

$isInsert2 = (boolean) ($test == "update"); // false

<=> $isInerst2 = (boolean) ("insert" == "update");
<=> $isInerst2 = (boolean) (false);
<=> $isInsert2 = false; // false

三番:

$isInsert3 = (boolean) $test == "update";   // true

<=> $isInsert3 = (((boolean) $test) == "update"); //$test "isset"
<=> $isInsert3 = (true == "update"); //"update" "isset"  ps.: true === "update" would be false!
<=> $isInsert3 = (true); // -> true

参照: http://php.net/manual/en/language.operators.precedence.php

あなたの主な「混乱」は事実だと思いtrue == "update"ますtrue。これは、==PHP では等しいことを意味しますが、同じことを===意味するためです。

詳細については、こちらをご覧ください: http://www.php.net/manual/en/language.operators.comparison.php

bool == ANYTHING右側が bool にキャストされます。そしてブールにキャストするとき:

(boolean)1 == (boolean)2 == (boolean)"AnyNotEmptyString" == true

false == (boolean)0 == (boolean)null == (boolean)"". (そして私が逃したものは何でも)

:ブール値の文字列表現が問題のブール値にキャストされることさえありません。文字列をブール値と比較する場合、重要なのは文字列が空 (または null、または "0") かどうかだけです。それなら間違いです!:

(Boolean)"false" == false // -> will return false
(Boolean)"false" == true // -> will return true.
(Boolean)"true" == true // -> will return true.
(Boolean)"true" == false// -> will return false.
(Boolean)"0" == true // -> will return false.
(Boolean)"0" == false// -> will return true.

抜粋:

   <?php
echo ((Boolean)"false" == false)?"true":"false";
echo "<br />";
echo ((Boolean)"false" == true)?"true":"false";
echo "<br />";
echo ((Boolean)"true" == true)?"true":"false";
echo "<br />";
echo ((Boolean)"true" == false)?"true":"false";
echo "<br />";
echo ((Boolean)"0" == true)?"true":"false";
echo "<br />";
echo ((Boolean)"0" == false)?"true":"false";
?>
于 2013-10-21T19:28:27.433 に答える
1

括弧がないと、ブール値にキャスト$testされます。

文字列は、PHP によって「空」と見なされる値を持たない限り、常にブール型の true と評価されます (のドキュメントemptyから取得)。

  1. ""(空の文字列)
  2. "0"(文字列として 0)

したがって、あなたの場合、PHPは解釈しています:

  1. $isInsert3 = (boolean) $test == "update";
  2. $isInsert3 = ((boolean) $test) == "update";
  3. $isInsert3 = true == "update";
  4. $isInsert3 = true == true;
于 2013-10-21T19:27:36.543 に答える
1

この問題は、演算子の優先順位に関連しています。実際には (boolean) は比較よりも優先度の高い演算子です。これは、3行目が同等であることを意味します

$tmp = (boolean) $test; //true
$isInsert3 = (bool == "update"); // boolean true and non-empty string are treated as equal when you do ==
于 2013-10-21T19:29:10.410 に答える
0

この予期しない動作の原因は、3 番目のインスタンスで、の結果ではなく$testブール値にキャストしていることです。$test == "update"

"insert" を bool にキャストすると true になります。空でない文字列はすべて true として評価されます。次にtrue == "string"、ブール値を他の型と比較すると、両方の型がブール値として扱われるため、true と評価されます。繰り返しますが、"string" のような空でない文字列は true と同等です。したがってtrue == true、驚くことではありませんが、true と同等です。

脚注 - のような演算子を使用して 2 つの変数を比較する場合==、結果をブール値にキャストする必要はありません。結果は常にブール値になります。

于 2013-10-21T19:28:30.170 に答える