if statement - Type-juggling and (strict) greater/lesser-than comparisons in PHP -


php famous type-juggling. must admit puzzles me, , i'm having hard time find out basic logical/fundamental things in comparisons.

for example: if $a > $b true , $b > $c true, must mean $a > $c always true too?

following basic logic, yes i'm puzzled not trust php in this. maybe can provide example not case?

also i'm wondering strict lesser-than , strict greater-than operators (as meaning described strictly knew in past equality comparisons) if makes difference if left , right operands swapped strictly unequal values:

# precondition: if ($a === $b) {     throw new exception(        'both strictly equal - can not compare strictly greater or smaller'     ); }  ($a > $b) !== ($b > $a) 

for of type comparison combinations these greater / lesser comparison operators not documented, reading manual not helpful in case.

php's comparison operators deviate computer-scientific definitions in several ways:

in order constitute equivalence relation == has reflexive, symmetric , transitive:

  • php's == operator not reflexive, i.e. $a == $a not true:

    var_dump(nan == nan); // bool(false) 

    note: fact comparison involving nan false not specific php. mandated ieee 754 standard floating-point arithmetic (more info).

  • php's == operator symmetric, i.e. $a == $b , $b == $a same.

  • php's == operator not transitive, i.e. $a == $b , $b == $c not follows $a == $c:

    var_dump(true == "a"); // bool(true) var_dump("a" == 0);    // bool(true) var_dump(true == 0);   // bool(false) 

in order constitute partial order <=/>= has reflexive, anti-symmetric , transitive:

  • php's <= operator not reflexive, i.e. $a <= $a not true (example same ==).

  • php's <= operator not anti-symmetric, i.e. $a <= $b , $b <= $a not follow $a == $b:

    var_dump(nan <= "foo"); // bool(true) var_dump("foo" <= nan); // bool(true) var_dump(nan == "foo"); // bool(false) 
  • php's <= operator not transitive, i.e. $a <= $b , $b <= $c not follow $a <= $c (example same ==).

  • extra: php's <= operator not total, i.e. both $a <= $b , $b <= $a can false:

    var_dump(new stdclass <= new datetime); // bool(false) var_dump(new datetime <= new stdclass); // bool(false) 

in order constitute strict partial order </> has irreflexive, asymmetric , transitive:

  • php's < operator irreflexive, i.e. $a < $a never true. note true only of php 5.4. inf < inf evaluated true.

  • php's < operator not asymmetric, i.e. $a < $b not follow !($b < $a) (example same <= not being anti-symmetric).

  • php's < operator not transitive, i.e. $a < $b , $b < $c not follow $a < $c:

    var_dump(-inf < 0);    // bool(true) var_dump(0 < true);    // bool(true) var_dump(-inf < true); // bool(false) 
  • extra: php's < operator not trichotomous, i.e. of $a < $b, $b < $a , $a == $b can false (example same <= not being total).

  • extra: php's < operator can circular, i.e. possible $a < $b, $b < $c , $c < $a:

    var_dump(inf < []);           // bool(true) var_dump([] < new stdclass);  // bool(true) var_dump(new stdclass < inf); // bool(true) 

    note: above example throws "object of class stdclass not converted double" notice.

you can find few nice graphs php's comparison operators on php sadness 52 - comparison operators.

as last note, want point out there 2 equalities php does guarantee (unlike pretty else). these 2 hold, because compiler reduces 1 other:

($a > $b) == ($b < $a) ($a >= $b) == ($b <= $a) 

Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -