4月4日、PHPでの比較演算子の操作に関するstackoverflowで
質問が発生し
ました。 すぐに、彼は詳細な回答を受け取りました。 確かに多くの人にとって、これは興味深いトピックです。
質問
PHPは型キャストで有名です。 比較ロジックの基本を探すのに多くの時間を費やしました。
たとえば、
$a > $b
がtrueで
$b > $c
がtrueの場合、これは
$b > $c
もtrueであることを意味しますか?
最も単純なロジックに導かれ、この式も真であると仮定できますが、この問題についてはPHPを本当に信用していません。 誰かが私にこの声明が間違っている例を与えることができますか?
また、「もっと」と「より少ない」オペレーターの仕事にも興味があります。 式が反転すると、比較の結果は変わりますか?
ほとんどのタイプの組み合わせでは、比較演算子の操作の多かれ少なかれは文書化されていません。
答え
PHPの比較演算子は、いくつかの点で標準的な定義とは異なります。
平等の関係は、反射的、対称的、推移的でなければなりません。
- PHPの
==
演算子は反射的ではありません 。つまり、 $a == $a
常に真で$a == $a
ません。
var_dump(NAN == NAN);
注:NAN比較が常にfalseであるという事実は、PHPの機能ではありません。 この動作は、浮動小数点数を表現する形式のIEEE 754標準で定義されています( stackoverflowの説明 )。
- 演算子
==
対称です 。つまり、 $a == $b
と$b == $a
常に等しいです。
==
演算子は推移的ではありません 。つまり、 $a == $b
および$b == $c
は、 $b == $c
意味するわけではありません。
var_dump(true == "a");
関係
<=
/
>=
は、反射的、反対称的、推移的であってはなりません。
厳密な不等式の関係
<
/
>
は、反反射的、非対称的、推移的でなければなりません。
- PHPの
<
演算子は反反射的です 。つまり、 $a < $a
常にfalseです。 これは、PHP 5.4以降に関連しています。 INF < INF
以前のバージョンでは、 INF < INF
はtrueです。
- 演算子
<
非対称で<
ません 。つまり、式$a < $b
の真理は、 !($b < $a)
が真であることを意味しません!($b < $a)
<=
例を参照)。
- 演算子
<
推移的で<
ません 。つまり、 $a < $b
および$b < $c
の真理は、 $b < $c
も真で$a < $c
ことを意味しません。 var_dump(-INF < 0);
- さらに 、演算子
<
三分法で<
ません 。つまり、式$a < $b
、 $b < $a
および$a == $b
は偽になる可能性があります(例は<=
場合と同じです)。
- さらに:演算子
<
はループバックできます。つまり、 $a < $b
、 $b < $c
および$c < $a
が真である場合があります。 var_dump(INF < []);
注:この例では、レベル通知の警告「クラスstdClassのオブジェクトをdoubleに変換できませんでした」を生成します。
PHP Sadness 52-Comparison Operatorsの記事でいくつかの
素晴らしいグラフを見つけることができます。
そして最後に、インタプリタがそれらを1つの形式にするため、PHPの2つの同等性が保証されます(他のほとんどすべてとは異なります)。
($a > $b) == ($b < $a) ($a >= $b) == ($b <= $a)
UPD:2番目の答え
PHP(バージョン5.5.0beta2に関連)では、厳密な比較はありません> ==または<==型チェックがありますが、より多く/より少ないを比較する前に型を比較する方法がいくつかあります:
if ( gettype($a)===gettype($b) ) ...
if ( (string)$a===(string)$b ) ...
、変数を目的の型に明示的にキャストしますif ( (string)$a===(string)$b ) ...
if ( ($a.'')===($b.'') ) ...
次の点にも注意してください。
- 浮動小数点数の精度は制限されています。
- 定数NANおよびINFはfloat型です。
- INFとINFの比較は数学的に間違っています。
- 電子表記法の数字は、たとえ小さいとしても、フロートの一種です。
- PHP_INT_MAXより大きい整数は、自動的に浮動小数点数に変換されます。
- システムによって定義された境界外の浮動小数点数にはINFが含まれます。
- 宣言されていない変数はNULLを返します。
- 割り当てられると、0で始まる整数は8進数から10進数に変換されます。
- 文字列が整数にキャストされると、先頭のゼロが失われます。
いくつかの具体的な比較
珍しい $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) float(-INF) false false false false false false float(NAN) float(0) false false false false false false float(NAN) float(1) false false false false false false float(NAN) float(INF) false false false false false false float(NAN) float(NAN) false false false false false false float(NAN) int(-1) false false false false false false float(NAN) int(0) false false false false false false float(NAN) int(1) false false false false false false
翻訳者のメモ:上記の答えは、NANとの比較はfalseを返すため、ここで異常なことは何もないということです。 等しいが同一ではない $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) array() false false true true true false NULL(NULL) bool(false) false false true true true false NULL(NULL) float(0) false false true true true false NULL(NULL) int(0) false false true true true false NULL(NULL) str('') false false true true true false array() bool(false) false false true true true false bool(false) float(0) false false true true true false bool(false) int(0) false false true true true false str('') bool(false) false false true true true false bool(false) str('0') false false true true true false float(-INF) bool(true) false false true true true false bool(true) float(1) false false true true true false float(INF) bool(true) false false true true true false float(NAN) bool(true) false false true true true false bool(true) int(-1) false false true true true false bool(true) int(1) false false true true true false bool(true) str("\0") false false true true true false bool(true) str('+') false false true true true false bool(true) str('-') false false true true true false bool(true) str('01') false false true true true false bool(true) str('1') false false true true true false bool(true) str('false') false false true true true false str('text') bool(true) false false true true true false str('true') bool(true) false false true true true false int(0) float(0) false false true true true false str("\0") float(0) false false true true true false str('') float(0) false false true true true false str('+') float(0) false false true true true false str('-') float(0) false false true true true false str('0') float(0) false false true true true false str('false') float(0) false false true true true false str('text') float(0) false false true true true false str('true') float(0) false false true true true false int(1) float(1) false false true true true false float(1) str('01') false false true true true false float(1) str('1') false false true true true false str("\0") int(0) false false true true true false str('') int(0) false false true true true false str('+') int(0) false false true true true false str('-') int(0) false false true true true false int(0) str('0') false false true true true false str('false') int(0) false false true true true false str('text') int(0) false false true true true false str('true') int(0) false false true true true false int(1) str('01') false false true true true false int(1) str('1') false false true true true false str('1') str('01') false false true true true false
同時にますます少なくなりますか? $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b float(NAN) str("\0") true true true true false false float(NAN) str('') true true true true false false float(NAN) str('+') true true true true false false float(NAN) str('-') true true true true false false float(NAN) str('0') true true true true false false float(NAN) str('01') true true true true false false float(NAN) str('1') true true true true false false float(NAN) str('false') true true true true false false float(NAN) str('text') true true true true false false float(NAN) str('true') true true true true false false
同一 $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) NULL(NULL) false false true true true true float(-INF) float(-INF) false false true true true true float(INF) float(INF) false false true true true true
多かれ少なかれ $a VS. $b $a>$b $a<$b $a<=$b $a>=$b $a==$b $a===$b NULL(NULL) bool(true) false true true false false false float(-INF) NULL(NULL) true false false true false false NULL(NULL) float(1) false true true false false false float(INF) NULL(NULL) true false false true false false float(NAN) NULL(NULL) true false false true false false NULL(NULL) int(-1) false true true false false false NULL(NULL) int(1) false true true false false false NULL(NULL) str("\0") false true true false false false NULL(NULL) str('+') false true true false false false NULL(NULL) str('-') false true true false false false NULL(NULL) str('0') false true true false false false NULL(NULL) str('01') false true true false false false NULL(NULL) str('1') false true true false false false NULL(NULL) str('false') false true true false false false NULL(NULL) str('text') false true true false false false NULL(NULL) str('true') false true true false false false array() bool(true) false true true false false false float(-INF) array() false true true false false false array() float(0) true false false true false false array() float(1) true false false true false false float(INF) array() false true true false false false float(NAN) array() false true true false false false array() int(-1) true false false true false false array() int(0) true false false true false false array() int(1) true false false true false false array() str("\0") true false false true false false str('') array() false true true false false false array() str('+') true false false true false false array() str('-') true false false true false false array() str('0') true false false true false false array() str('01') true false false true false false array() str('1') true false false true false false array() str('false') true false false true false false array() str('text') true false false true false false array() str('true') true false false true false false bool(true) bool(false) true false false true false false float(-INF) bool(false) true false false true false false float(1) bool(false) true false false true false false float(INF) bool(false) true false false true false false float(NAN) bool(false) true false false true false false bool(false) int(-1) false true true false false false int(1) bool(false) true false false true false false bool(false) str("\0") false true true false false false bool(false) str('+') false true true false false false bool(false) str('-') false true true false false false bool(false) str('01') false true true false false false str('1') bool(false) true false false true false false bool(false) str('false') false true true false false false str('text') bool(false) true false false true false false str('true') bool(false) true false false true false false bool(true) float(0) true false false true false false bool(true) int(0) true false false true false false str('') bool(true) false true true false false false bool(true) str('0') true false false true false false float(-INF) float(0) false true true false false false float(-INF) float(1) false true true false false false float(INF) float(-INF) true false false true false false float(-INF) int(-1) false true true false false false float(-INF) int(0) false true true false false false float(-INF) int(1) false true true false false false float(-INF) str("\0") false true true false false false float(-INF) str('') false true true false false false float(-INF) str('+') false true true false false false float(-INF) str('-') false true true false false false float(-INF) str('0') false true true false false false float(-INF) str('01') false true true false false false float(-INF) str('1') false true true false false false float(-INF) str('false') false true true false false false float(-INF) str('text') false true true false false false float(-INF) str('true') false true true false false false float(1) float(0) true false false true false false float(INF) float(0) true false false true false false float(0) int(-1) true false false true false false int(1) float(0) true false false true false false float(0) str('01') false true true false false false str('1') float(0) true false false true false false float(INF) float(1) true false false true false false float(1) int(-1) true false false true false false float(1) int(0) true false false true false false float(1) str("\0") true false false true false false str('') float(1) false true true false false false float(1) str('+') true false false true false false float(1) str('-') true false false true false false float(1) str('0') true false false true false false float(1) str('false') true false false true false false str('text') float(1) false true true false false false str('true') float(1) false true true false false false float(INF) int(-1) true false false true false false float(INF) int(0) true false false true false false float(INF) int(1) true false false true false false float(INF) str("\0") true false false true false false float(INF) str('') true false false true false false float(INF) str('+') true false false true false false float(INF) str('-') true false false true false false float(INF) str('0') true false false true false false float(INF) str('01') true false false true false false float(INF) str('1') true false false true false false float(INF) str('false') true false false true false false float(INF) str('text') true false false true false false float(INF) str('true') true false false true false false int(0) int(-1) true false false true false false int(1) int(-1) true false false true false false str("\0") int(-1) true false false true false false str('') int(-1) true false false true false false str('+') int(-1) true false false true false false str('-') int(-1) true false false true false false str('0') int(-1) true false false true false false int(-1) str('01') false true true false false false str('1') int(-1) true false false true false false str('false') int(-1) true false false true false false str('text') int(-1) true false false true false false str('true') int(-1) true false false true false false int(1) int(0) true false false true false false int(0) str('01') false true true false false false str('1') int(0) true false false true false false int(1) str("\0") true false false true false false str('') int(1) false true true false false false int(1) str('+') true false false true false false int(1) str('-') true false false true false false int(1) str('0') true false false true false false int(1) str('false') true false false true false false str('text') int(1) false true true false false false str('true') int(1) false true true false false false str('') str("\0") false true true false false false str('+') str("\0") true false false true false false str('-') str("\0") true false false true false false str("\0") str('0') false true true false false false str("\0") str('01') false true true false false false str('1') str("\0") true false false true false false str('false') str("\0") true false false true false false str('text') str("\0") true false false true false false str('true') str("\0") true false false true false false str('') str('+') false true true false false false str('') str('-') false true true false false false str('') str('0') false true true false false false str('') str('01') false true true false false false str('') str('1') false true true false false false str('') str('false') false true true false false false str('') str('text') false true true false false false str('') str('true') false true true false false false str('-') str('+') true false false true false false str('+') str('0') false true true false false false str('+') str('01') false true true false false false str('1') str('+') true false false true false false str('false') str('+') true false false true false false str('text') str('+') true false false true false false str('true') str('+') true false false true false false str('-') str('0') false true true false false false str('-') str('01') false true true false false false str('1') str('-') true false false true false false str('false') str('-') true false false true false false str('text') str('-') true false false true false false str('true') str('-') true false false true false false str('0') str('01') false true true false false false str('1') str('0') true false false true false false str('false') str('0') true false false true false false str('text') str('0') true false false true false false str('true') str('0') true false false true false false str('false') str('01') true false false true false false str('text') str('01') true false false true false false str('true') str('01') true false false true false false str('1') str('false') false true true false false false str('text') str('1') true false false true false false str('true') str('1') true false false true false false str('text') str('false') true false false true false false str('true') str('false') true false false true false false str('true') str('text') true false false true false false
$ a> $ b> $ cで$ aが最大$ cである例 A<C : float(NAN) > str('a') > str('') A<C : float(NAN) > str('a') > str('1') A<C : float(NAN) > str('a') > str('A') A<C : float(NAN) > str('a') > str('0') A<C : float(NAN) > str('1') > str('') A<C : float(NAN) > str('1') > str('0') A<C : float(NAN) > str('A') > str('') A<C : float(NAN) > str('A') > str('1') A<C : float(NAN) > str('A') > str('0') A<C : float(NAN) > str('0') > str('') A==C : str('') > float(NAN) > NULL(NULL) A===C : str('') > float(NAN) > str('') A<C : str('') > float(NAN) > str('a') A<C : str('') > float(NAN) > str('1') A==C : str('') > float(NAN) > bool(false) A<C : str('') > float(NAN) > str('A') A<C : str('') > float(NAN) > str('0') A==C : str('') > float(-INF) > NULL(NULL) A==C : str('') > float(-INF) > bool(false) A==C : str('') > int(-1) > NULL(NULL) A==C : str('') > int(-1) > bool(false) A==C : str('') > float(-1) > NULL(NULL) A==C : str('') > float(-1) > bool(false) A==C : array() > float(NAN) > NULL(NULL) A==C : array() > float(NAN) > bool(false) A==C : array() > float(INF) > NULL(NULL) A==C : array() > float(INF) > bool(false) A==C : array() > float(-INF) > NULL(NULL) A==C : array() > float(-INF) > bool(false) A==C : array() > str('a') > NULL(NULL) A==C : array() > str('a') > bool(false) A==C : array() > int(1) > NULL(NULL) A==C : array() > int(1) > bool(false) A==C : array() > float(1) > NULL(NULL) A==C : array() > float(1) > bool(false) A==C : array() > str('1') > NULL(NULL) A==C : array() > str('1') > bool(false) A==C : array() > str('A') > NULL(NULL) A==C : array() > str('A') > bool(false) A==C : array() > str('0') > NULL(NULL) A==C : array() > int(-1) > NULL(NULL) A==C : array() > int(-1) > bool(false) A==C : array() > float(-1) > NULL(NULL) A==C : array() > float(-1) > bool(false) A===C : str('a') > float(NAN) > str('a') A<C : str('a') > str('') > float(NAN) A<C : str('a') > str('1') > float(NAN) A==C : str('a') > str('1') > int(0) A==C : str('a') > str('1') > float(0) A<C : str('a') > str('A') > float(NAN) A<C : str('a') > str('0') > float(NAN) A==C : bool(true) > str('') > float(NAN) A==C : bool(true) > str('') > float(-INF) A==C : bool(true) > str('') > int(-1) A==C : bool(true) > str('') > float(-1) A==C : bool(true) > array() > float(NAN) A==C : bool(true) > array() > float(INF) A==C : bool(true) > array() > float(-INF) A==C : bool(true) > array() > str('a') A==C : bool(true) > array() > int(1) A==C : bool(true) > array() > float(1) A==C : bool(true) > array() > str('1') A==C : bool(true) > array() > str('A') A==C : bool(true) > array() > int(-1) A==C : bool(true) > array() > float(-1) A==C : bool(true) > int(0) > float(-INF) A==C : bool(true) > int(0) > int(-1) A==C : bool(true) > int(0) > float(-1) A==C : bool(true) > str('0') > float(NAN) A==C : bool(true) > str('0') > float(-INF) A==C : bool(true) > str('0') > int(-1) A==C : bool(true) > str('0') > float(-1) A==C : bool(true) > float(0) > float(-INF) A==C : bool(true) > float(0) > int(-1) A==C : bool(true) > float(0) > float(-1) A==C : int(1) > str('a') > str('1') A==C : int(1) > str('A') > str('1') A==C : float(1) > str('a') > str('1') A==C : float(1) > str('A') > str('1') A<C : str('1') > float(NAN) > str('a') A===C : str('1') > float(NAN) > str('1') A<C : str('1') > float(NAN) > str('A') A<C : str('1') > str('') > float(NAN) A<C : str('1') > str('0') > float(NAN) A<C : str('A') > float(NAN) > str('a') A===C : str('A') > float(NAN) > str('A') A<C : str('A') > str('') > float(NAN) A<C : str('A') > str('1') > float(NAN) A==C : str('A') > str('1') > int(0) A==C : str('A') > str('1') > float(0) A<C : str('A') > str('0') > float(NAN) A==C : int(0) > float(-INF) > NULL(NULL) A==C : int(0) > float(-INF) > bool(false) A==C : int(0) > int(-1) > NULL(NULL) A==C : int(0) > int(-1) > bool(false) A==C : int(0) > float(-1) > NULL(NULL) A==C : int(0) > float(-1) > bool(false) A<C : str('0') > float(NAN) > str('a') A<C : str('0') > float(NAN) > str('1') A==C : str('0') > float(NAN) > bool(false) A<C : str('0') > float(NAN) > str('A') A===C : str('0') > float(NAN) > str('0') A==C : str('0') > float(-INF) > bool(false) A<C : str('0') > str('') > float(NAN) A==C : str('0') > int(-1) > bool(false) A==C : str('0') > float(-1) > bool(false) A==C : float(0) > float(-INF) > NULL(NULL) A==C : float(0) > float(-INF) > bool(false) A==C : float(0) > int(-1) > NULL(NULL) A==C : float(0) > int(-1) > bool(false) A==C : float(0) > float(-1) > NULL(NULL) A==C : float(0) > float(-1) > bool(false)
面白い文字列の比較:
'Queen' > 'King' > 'Jack' > 'Ace'
比較については
、PHPの型比較表も参照してください。
isset()
およびis_null()
- if()およびempty()
==
と===
違い
Git Hubでリストを生成したコード
PHPバージョンの違い:
http :
//3v4l.org/MAfDu