SORU
4 NİSAN 2013, PERŞEMBE


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
4 NİSAN 2013, PERŞEMBE


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 zaman false 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 == $cdeğ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 önce true 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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kamikazeepanda

    Kamikazeepan

    5 ŞUBAT 2006
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012