Tip-Hokkabazlık ve (katı) Daha fazla/Daha Az Karşılaştırmalar PHP
PHP tip-hokkabazlık ünlüdür. Bu beni şaşırtıyor itiraf etmeliyim ve karşılaştırmalar temel mantık/temel şeyler öğrenmek için zor bir zaman geçiriyorum.
$a > $b
doğru ve $b > $c
gerçek, $a > $c
demek gerekir . örneğin: ^em>her zamandoğru mu?
Temel mantık söyleyebilirimEvetancak gerçekten bu PHP güvenmiyorum ki kafam karıştı. Belki birileri bu değildir ama bir örnek verebilir?
Ayrıca merak ediyorum ile daha az sıkı, daha sıkı ve daha büyük operatörleri (gibi anlamları olarak açıklanan kesinlikle ben sadece bilir, geçmişten eşitlik karşılaştırmaları) yapar eğer herhangi bir fark varsa, sol ve sağ işlenen vardır takas ile kesinlikle eşit olmayan değerler:
# precondition:
if ($a === $b) {
throw new Exception(
'both are strictly equal, can not compare strictly for greater or smaller'
);
}
($a > $b) !== ($b > $a)
Her tür karşılaştırma en kombinasyonları greater / lesser comparison operators bu Kılavuzu okumak ... bu durumda gerçekten yardımcı oldu, böylece belgelenmiştir.
CEVAP
PHP karşılaştırma operatörleri bilgisayar-bilimsel çeşitli şekillerde tanımlar: sapma
Bir teşkil etmek üzeredenklik==
yansımalı, simetrik ve geçişli yapmak gerekiyor
PHP
==
operatördönüşlü değilyani$a == $a
Her zaman doğru değildir:var_dump(NAN == NAN); // bool(false)
Not: herhangi bir karşılaştırma
NAN
ilgili her zamanfalse
aslında PHP özgü değildir. Kayan Nokta Aritmetiği için IEEE 754 Standardı (more info) tarafından görevlendirilmiş.PHP
==
operatörsimetrikyani$a == $b
$b == $a
her zaman aynıdır.PHP
==
operatörgeçişli değilyani$a == $b
$b == $c
değil*24 şekildedir:*var_dump(true == "a"); // bool(true) var_dump("a" == 0); // bool(true) var_dump(true == 0); // bool(false)
Bir teşkil etmek üzerekısmi sipariş26*/>=
*dönüşlü olmalı, anti-simetrik ve geçişli:
PHP
<=
operatördönüşlü değilyani$a <= $a
Her zaman doğru (Örnek==
için aynı değildir.PHP
<=
operatöranti-simetrik değilyani$a <= $b
$b <= $a
$a == $b
izleyin:var_dump(NAN <= "foo"); // bool(true) var_dump("foo" <= NAN); // bool(true) var_dump(NAN == "foo"); // bool(false)
PHP
<=
operatörgeçişli değilyani$a <= $b
$b <= $c
$a <= $c
izlemez (Örnek==
için aynı).Ekstra:
<=
operatör PHPtoplam değilher ikisinede$a <= $b
$b <= $a
yanlış olabilir:var_dump(new stdClass <= new DateTime); // bool(false) var_dump(new DateTime <= new stdClass); // bool(false)
Bir teşkil etmek üzeresıkı kısmi sipariş<
/>
irreflexive, asimetrik ve geçişli yapmak gerekiyor
PHP
<
operatörirreflexiveyani$a < $a
asla doğru değildir. Bu doğru olmasına dikkat edinsadece PHP 5.4. Daha öncetrue
49 *değerlendirdi.PHP
<
operatörasimetrik değilyani$a < $b
!($b < $a)
izlemez (Örnek<=
aynı anti-simetrik olmak.PHP
<
operatörgeçişli değilyani$a < $b
57$a < $c
izleyin:var_dump(-INF < 0); // bool(true) var_dump(0 < TRUE); // bool(true) var_dump(-INF < TRUE); // bool(false)
Ekstra:
<
operatör PHPtrichotomous değilyani$a < $b
,$b < $a
$a == $b
yanlış olabilir (Örnek<=
aynı toplam olmak.Ekstra:
<
operatör olabilir PHPdaireselyani$a < $b
,$b < $c
$c < $a
mümkündür:var_dump(INF < []); // bool(true) var_dump([] < new stdClass); // bool(true) var_dump(new stdClass < INF); // bool(true)
Not: örnek atar yukarıda bir "sınıf stdClass Object çift dönüştürülemedi" dikkat edin.
PHP Sadness 52 - Comparison operators PHP karşılaştırma operatörleri için bir kaç güzel grafikler bulabilirsiniz.
Son bir not olarak, PHP bu iki eşitlik olduğunu işaret etmek istiyorumyokgaranti (her şey çok farklı olarak). Bu ikisi her zaman sadece derleyici başka bir azalttığı tutun:
($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)
Neden gıt gıt protokolü-http-arka uç d...
Neden bu dize uzunluğu daha fazla kara...
daha fazla ruh madness - çözümleyici-t...
İnş-doğruluğu derleyici optimizasyonu ...
3 veya daha fazla sayı için ortak katl...