首頁>Program>source

PHP以其型別轉換而闻名.我必须承认,這使我感到困惑,而且我很难在比较中找出基本的邏輯/基础知識。

例如:如果 $a > $b 是真的, $b > $c 是真的,這是否意味着 $a > $c 总是是真的吗?

按照基本邏輯,我会說,但是我對此感到困惑,因為我並不真的相信PHP.也许有人可以提供一个例子,而事實並非如此?

我也想知道嚴格的小於運算符和嚴格大於運算符(因為它们的含義被描述為嚴格的,我過去从等式比较中才知道),如果左右操作數對它有什麼影响 交換為嚴格不相等的值:

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}
($a > $b) !== ($b > $a)

對於大多數型別比较組合,大多數较大/较小的比较運算符没有記錄,因此 在這種情况下,阅讀手册並没有真正的帮助。

最新回復
  • 5月前
    1 #

    PHP的比较運算符通過以下几種方式偏离了計算機科學的定義:

    為了構成對等關係 == 必须自反,對稱和傳遞:

      PHP's == 運算符是 not reflexive ,即 $a == $a 並非总是如此:

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

      註意:以下事實涉及 NAN 永远是 false 不特定於PHP.它是由IEEE 754浮點演算法標準(更多資訊)規定的。

      PHP的 == 運算符是 symmetric ,即 $a == $b$b == $a 总是一樣的。

      PHP的 == 運算符是 not transitive ,即来自 $a == $b$b == $c not吗 關註 $a == $c

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

      為了構成部分订單 <= / >= 必须自反,反對稱和傳遞:

        PHP's <= 運算符是 not reflexive ,即 $a <= $a 並不总是正確的(示例与 ==相同 )。

        PHP的 <= 運算符是 not anti-symmetric ,即来自 $a <= $b$b <= $a 不遵循 $a == $b

        var_dump(NAN <= "foo"); // bool(true)
        var_dump("foo" <= NAN); // bool(true)
        var_dump(NAN == "foo"); // bool(false)
        

        PHP的 <= 運算符是 not transitive ,即来自 $a <= $b$b <= $c 不遵循 $a <= $c (示例与 ==相同 )。

        附加:PHP的 <= 運算符是 not total ,即都是 $a <= $b$b <= $a 可以是錯誤的:

        var_dump(new stdClass <= new DateTime); // bool(false)
        var_dump(new DateTime <= new stdClass); // bool(false)
        

        為了構成嚴格的偏序 < / > 必须是反身,不對稱和可傳遞的:

          PHP's < 運算符是 irreflexive ,即 $a < $a 永远都不是真的.請註意,這是真實的 .以前是 only as of PHP 5.4 評價给 INF < INF

          PHP的 true 運算符是 < ,即来自 not asymmetric 不遵循 $a < $b (示例与 !($b < $a)相同 不是反對稱的。)

          PHP的 <= 運算符是 < ,即来自 not transitive$a < $b 不遵循 $b < $c

          $a < $c
          

          附加:PHP的 var_dump(-INF < 0); // bool(true) var_dump(0 < TRUE); // bool(true) var_dump(-INF < TRUE); // bool(false) 運算符是 < ,即所有 not trichotomous$a < $b$b < $a 可以為假(示例与 $a == $b相同 不是全部)。

          附加:PHP的 <= 運算符可以是 < ,即 circular$a < $b$b < $c

          $c < $a
          

          註意:上面的示例丟擲" stdClass類的物件無法轉換為double"的通知。

          在PHP Sadness 52-比较運算符上,您可以找到一些用於PHP比较運算符的漂亮圖形。

          最後一點,我要指出,PHP可以保證有两个相等的地方(与其他几乎所有其他地方一樣).這两个总是成立,只是因為編譯器將一个减少到另一个:

          var_dump(INF < []);           // bool(true)
          var_dump([] < new stdClass);  // bool(true)
          var_dump(new stdClass < INF); // bool(true)
          

  • 5月前
    2 #

    ($a > $b) == ($b < $a) ($a >= $b) == ($b <= $a) 嚴格相同比较運算符( no>== )(至少在PHP 5.6.14中)),但是有几種方法可以實現 在檢查大/小之前:

    使用 <==檢查两个變數型別

    強製进行所需的型別轉換,例如. enforce a strict type check

    強製執行所需的型別調整. if (gettype($a) === gettype($b))

    請註意:

    if ((string)$a === (string)$b) if (($a . '') === ($b . ''))

      Floating point precision is limited

      屬於 INF型別 在ieee754下

      某些Infinity等於其他一些Infinity(自PHP 5.4起)

      科學記號 NAN 始终為 float型別 ,再也不会 即使數量很小

      整數越過 e 自動轉換為 float

      在系統邊界上浮動会得到 integer

      未定義變數的型別和值 PHP_INT_MAX

      float開頭的整數 按照惯例从八进製轉換為十进製

      使用前匯 INF轉換包含整數的字元串 to整數会去除领先的 NULL

      一些異国比较的列表:

  • 5月前
    3 #

    在您對問题的第二部分进行更正之後,我將其餘部分的答案留给其他人.我只想對您問题的第一部分给出最令人惊讶的答案,即是否有 0的例子 和 0 運算符不可傳遞.在這裏。

    這些全都是 0

    
    

    如果 $a > $b > $c 是可傳遞的( $a wy $c> ),最後一行是

    >
    

    但是PHP会尝試友好(?!),並尽可能將字元串解釋為數字。

    事實證明,由於上述不透明性, > 可以對

      进行排序 元素成 isset() 順序取決於他们的輸入順序, is_null() if() (並且没有元素是NAN).我在對sort()的註釋中指出了這一點,其本質是:

      empty()
      
      ==

  • Java会话管理的最佳選擇
  • java:建立一个用於分發的Android Jar庫