は常に?$a == $b
と同等です。$b == $a
JavaScript では、キャストが原因で、正しくない奇妙なケースがいくつかあると思います。
要するに、はい。$a == $b
は常に と同等です$b == $a
。浮きなどの短所があります。もちろん、平等のために 2 つの float をネストするべきではありません。
EDIT
フロートについて:2つのフロートがあり、それらを比較した場合、技術的には同じである必要があります。ただし、同じ値を持っているように見える浮動小数点値は、実際には同じである必要はありません。したがって、$a
がリテラル.69
で$b
が計算の結果である場合、それらはまったく異なる可能性がありますが、どちらも同じ値を表示します。これが、 を使用して浮動小数点値を比較してはならない理由です==
。
浮動小数点値を比較する必要がある場合は、特定のケースで許容される最小の差を使用する必要があります。このようなものは、フロートを比較するために機能します (最小許容差を に設定します0.000001
):
if(abs($a-$b) < 0.000001) {
//Same
}
私が異なっているのを見ることができた唯一のタイプは次のようなものです:
$foo = 1;
$bar = 1;
($foo = $foo + $bar) == ($bar = $foo);
理由を確認するには、それを見てください
A -> ($foo = $foo + $bar)
B -> ($bar = $foo);
A
を最初に実行すると、結果は になり、2
の結果はB
2 になるため、それらは等しく、テストは になりますtrue
。
B
を最初に実行すると、結果は になり、1
の結果はB
2 になるため、それらは等しくなく、テストは になりますfalse
。
ただし、単一の型比較 (式でA
はなく変数である場所) では、常に再帰的になります。
したがって、一般的な意味でA == B
は、 が常に と同等であることが 100% 保証されるわけではありませんB == A
。変数の場合、常に同等になります。しかし、変数の代入や変更を伴う複雑な式の場合はそうではないかもしれません。
これらの 2 つの呼び出しの間で何が起こるかによって異なります。そうでなければ、それらは同じです。順番に違いはありません。2 つの equals==
の使用 1 の文字列と 1 の整数は、比較すると true を返します。タイプは無視され、値のみが比較されます。だから奇妙さはありません。
http://php.net/manual/en/language.operators.comparison.php
<?
$a=(string) 1;
$b=(int) 1;
var_dump($a);
var_dump($b);
echo $a==$b;
出力: 1
編集
明確にするために、演算子の反対側に置くだけで、比較で異なる出力を得るために $a または $b に入れることができるものは絶対にありません。
$a="1234";
$b="1234";
echo $a==$b;
echo $b==$a;
その出力は、任意の $a または $b 値に対して、常に間違いなく true true または false false になります。
http://php.net/manual/en/language.operators.comparison.php
比較で型キャストを考慮したい場合に使用できるさまざまな演算子があります。 ==
値が等しい場合は true と評価されますが、データ型は比較されません。===
値とデータ型が等しい場合に true と評価されます。後者を使用すると、通常は無視されるタイプのキャストが考慮されます (例: 整数を表す文字列と比較される整数)。
条件内のロジックの順序に違いはありません。
($a == $b) !== ($b == $a)
私はいくつかのバリエーションを試しましたが、これまでのところ何も機能していないケースを見つけることができません:
<?php
$a = 0;
$b = "0";
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = 0;
$b = NULL;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = 0;
$b = false;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = false;
$b = NULL;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = "";
$b = NULL;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = "NULL";
$b = NULL;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = 0.000000000000000000000000001;
$b = 0;
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
$a = array();
$b = array();
echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
というわけで、今回は諦めます。アイデア大歓迎!