Kiểu tung hứng và (nghiêm ngặt) lớn hơn / ít hơn so với so sánh trong PHP


115

PHP nổi tiếng với kiểu tung hứng. Tôi phải thừa nhận nó đánh đố tôi, và tôi đang gặp khó khăn để tìm ra những điều cơ bản / logic cơ bản trong so sánh.

Ví dụ: Nếu $a > $blà đúng sự thật và $b > $clà sự thật, nó phải có nghĩa là $a > $cluôn luôn đúng không?

Theo logic cơ bản, tôi sẽ nói tuy nhiên tôi cảm thấy khó hiểu Tôi không thực sự tin tưởng PHP vào việc này. Có lẽ ai đó có thể cung cấp một ví dụ trong trường hợp này không phải là trường hợp?

Ngoài ra, tôi tự hỏi với các toán tử nhỏ hơn và nghiêm ngặt hơn so với các toán tử (vì ý nghĩa của chúng được mô tả là nghiêm ngặt mà tôi chỉ biết trong quá khứ so sánh bằng) nếu nó có bất kỳ sự khác biệt nào nếu các toán hạng trái và phải được hoán đổi với giá trị hoàn toàn không đồng đều:

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

($a > $b) !== ($b > $a)

Đối với hầu hết tất cả các kết hợp so sánh loại, các toán tử so sánh lớn hơn / nhỏ hơn này không được ghi lại, vì vậy đọc hướng dẫn không thực sự hữu ích trong trường hợp này.


Tôi đoán bạn muốn sửa dòng đó để được ($a > $b) !== ($b < $a)?
Walter Tross

ah, ok, vì vậy tôi hiểu lầm rằng. Sẽ phải sửa câu trả lời của tôi cho phù hợp. Hài hước cho tất cả những người viết chuyên luận thay vì trả lời và không đọc kỹ câu hỏi của bạn ...
Walter Tross

Câu trả lời:


208

Các toán tử so sánh của PHP đi chệch khỏi các định nghĩa khoa học máy tính theo nhiều cách:

Để tạo thành một mối quan hệ tương đương == phải là phản xạ, đối xứng và bắc cầu:

  • ==Toán tử của PHP không phảiphản xạ , tức $a == $alà không phải lúc nào cũng đúng:

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

    Lưu ý: Thực tế là mọi so sánh liên quan NANluôn falsekhông cụ thể đối với PHP. Nó được quy định bởi Tiêu chuẩn IEEE 754 về Số học dấu phẩy động ( thông tin thêm ).

  • ==Toán tử của PHP là đối xứng , tức là $a == $b$b == $aluôn giống nhau.

  • PHP ==nhà điều hành là không bắc cầu , tức là từ $a == $b$b == $ckhông không sau $a == $c:

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

Để tạo thành một trật tự một phần <= / >=phải là phản xạ, chống đối xứng và bắc cầu:

  • <=Toán tử của PHP không phảiphản xạ , tức $a <= $alà không phải lúc nào cũng đúng (Ví dụ tương tự như đối với ==).

  • <=Toán tử của PHP không đối xứng , tức là từ $a <= $b$b <= $akhông tuân theo $a == $b:

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
  • <=Toán tử của PHP không mang tính bắc cầu , tức là từ $a <= $b$b <= $ckhông tuân theo $a <= $c(Ví dụ tương tự như đối với ==).

  • Thêm: <=Toán tử của PHP không phảitoàn bộ , tức là cả hai $a <= $b$b <= $acó thể sai:

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

Để tạo thành một trật tự một phần nghiêm ngặt < / >phải không phản xạ, không đối xứng và bắc cầu:

  • <Toán tử của PHP là không phản xạ , tức $a < $alà không bao giờ đúng. Lưu ý rằng điều này chỉ đúng với PHP 5.4 . Đánh INF < INFgiá trước đây để true.

  • <Toán tử của PHP không đối xứng , tức là từ $a < $bkhông tuân theo !($b < $a)(Ví dụ tương tự như <=không đối xứng).

  • <Toán tử của PHP không mang tính bắc cầu , tức là từ $a < $b$b < $ckhông tuân theo $a < $c:

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
  • Bổ sung: <Toán tử của PHP không phảitrichotomous , tức là tất cả $a < $b, $b < $a$a == $bcó thể sai (Ví dụ tương tự như <=không phải là tổng số).

  • Thêm: <Toán tử của PHP có thể là hình tròn , nghĩa là có thể $a < $b, $b < $c$c < $a:

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

    Lưu ý: Ví dụ trên đưa ra thông báo "Đối tượng của lớp stdClass không thể chuyển đổi thành gấp đôi".

Bạn có thể tìm thấy một vài biểu đồ đẹp cho các toán tử so sánh của PHP trên PHP Sadness 52 - Các toán tử so sánh .

Là một lưu ý cuối cùng, tôi muốn chỉ ra rằng có hai đẳng rằng PHP không bảo lãnh (không giống như nhiều tất cả mọi thứ khá khác). Hai cái này luôn luôn giữ, đơn giản là vì trình biên dịch giảm cái này sang cái kia:

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

2
Wow, anwer tốt đẹp. Vì vậy, nó không thể xây dựng các biểu thức logic với PHP như ($a > $b) and ($b > $c)với $a > $cmặc dù các tài liệu nói những </ >khai thác nói họ là nghiêm ngặt ?
hakre

26
Các toán tử IMHO thực hiện theo các quy tắc toán học, nhưng chỉ khi xử lý cùng loại dữ liệu. Đúc kiểu là những gì thực sự tạo ra sự nhầm lẫn ở đây (và trong nhiều tình huống khác). Khi so sánh số và chuỗi và chuyển đổi loại giá trị đặc biệt được thực hiện trước các toán tử, do đó, các toán tử so sánh nói đúng không gây nhầm lẫn, việc truyền là ...
ivanhoe

6
@ ivanhoe011 Sự thật là: Cả hai đều :) Quy tắc so sánh của PHP và quy tắc truyền của PHP khác nhau , bạn không thể nói đơn giản $a == $blà giống như vậy (type) $a === (type) $b. Một ví dụ đơn giản về điều này là "15" == "0xf", nhưng (int) "15" !== (int) "0xf". Và cả quy tắc so sánh và truyền trong PHP đều hoàn toàn điên rồ ^^
NikiC

3
@NikiC: ước tính (int)"0xf"thành số nguyên 0, vì vậy tất nhiên 0 !== 15. So sánh trong ví dụ này hành xử chính xác như mong đợi. Đây là buổi casting khó hiểu ở đây. Tôi sẽ thừa nhận, (INF < INF) === truelà một vấn đề so sánh thực sự, nhưng đó là một trường hợp đặc biệt và nó đã được giải quyết như bạn đã chỉ ra. Câu trả lời tuyệt vời .. +1
FtDRbwLXw6

1
Tôi không nhất thiết phải lỗi các nhà thiết kế PHP cho một số quyết định có ý nghĩa về sự ép buộc kiểu vào thời điểm đó ... nhưng tôi cảm thấy như đã nhận thấy kết quả của các lựa chọn thiết kế này và ngay lập tức nhận ra các lựa chọn rõ ràng là sai. Ví dụ rõ ràng nhất là nhận xét của @ ravz.
Chad

88

Không toán tử so sánh giống hệt nghiêm ngặt ( >==hoặc <==) trong PHP (ít nhất là bằng 5.6.6) , nhưng có một số cách để thực thi kiểm tra loại nghiêm ngặt trước khi kiểm tra Greater / Lower:

  1. Kiểm tra cả hai loại biến với if (gettype($a) === gettype($b))
  2. Buộc loại diễn viên cần thiết của bạn, vd. if ((string)$a === (string)$b)
  3. Buộc loại cần thiết của bạn, ví dụ. if (($a . '') === ($b . ''))

Hãy lưu ý rằng:

  • Độ chính xác điểm nổi là hạn chế
  • INFNANthuộc loại floatdưới
  • Một số Infinity bằng với một số khác Infinity (kể từ PHP 5.4)
  • Ký hiệu khoa học eluôn là loạifloat và không bao giờ integerngay cả khi số lượng nhỏ
  • Số nguyên đi qua PHP_INT_MAX được tự động chuyển đổi thànhfloat
  • Phao vượt qua ranh giới của hệ thống có được INF giá trị
  • Các biến không xác định có loại và giá trị NULL
  • Số nguyên đứng trước 0 được chuyển đổi từ bát phân sang thập phân (theo quy ước)
  • Chuyển đổi Chuỗi chứa một số nguyên có một số nguyên dẫn 0 đến các số nguyên hàng đầu0

Danh sách một số so sánh kỳ lạ:

Rất lạ:
     $ một 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

Bằng nhau nhưng không giống nhau:

     $ một VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  Mảng NULL (NULL) () false false true true true true false
  NULL (NULL) bool (false) false false true true true true false
  NULL (NULL) float (0) false false true true true true false
  NULL (NULL) int (0) sai sai đúng đúng đúng đúng sai
  NULL (NULL) str ('') sai sai đúng đúng đúng sai
   mảng () bool (false) false false true true true true
 bool (false) float (0) false false true true true true false
 bool (false) int (0) false false đúng đúng đúng sai
   str ('') bool (false) false false true true true true false
 bool (false) str ('0') false false true true true true false
 float (-INF) bool (true) false false true true true true false
  bool (true) float (1) false false true true true true false
  float (INF) bool (true) false false true true true true false
  float (NAN) bool (true) false false true true true true false
  bool (true) int (-1) false false true true true true false
  bool (true) int (1) false false true true true true false
  bool (true) str ("\ 0") false false true true true true true
  bool (true) str ('+') false false true true true true false
  bool (true) str ('-') false false true true true true false
  bool (true) str ('01 ') false false true true true true true
  bool (true) str ('1') false false true true true true false
  bool (true) str ('false') false false true true true true false
 str ('văn bản') bool (đúng) sai sai đúng đúng đúng đúng sai
 str ('true') bool (true) false false true true true true true
    int (0) float (0) false false true true true true false
  str ("\ 0") float (0) false false true true true true false
   str ('') float (0) false false true true true true false
   str ('+') float (0) false false true true true true false
   str ('-') float (0) false false true true true true false
   str ('0') float (0) false false true true true true false
 str ('false') float (0) false false true true true true false
 str ('text') float (0) false false true true true true false
 str ('true') float (0) false false true true true true false
    int (1) float (1) false false true true true true false
   float (1) str ('01 ') false false true true true true false
   float (1) str ('1') false false true true true true false
  str ("\ 0") int (0) sai sai đúng đúng đúng sai
   str ('') int (0) sai sai đúng đúng đúng sai
   str ('+') int (0) sai sai đúng đúng đúng sai
   str ('-') int (0) sai sai đúng đúng đúng sai
    int (0) str ('0') sai sai đúng đúng đúng sai
 str ('false') int (0) sai sai đúng đúng đúng đúng sai
 str ('văn bản') int (0) sai sai đúng đúng đúng sai
 str ('true') int (0) false false true true true true false
    int (1) str ('01 ') sai sai đúng đúng đúng sai
    int (1) str ('1') sai sai đúng đúng đúng sai
   str ('1') str ('01 ') sai sai đúng đúng đúng đúng sai

Hạ và Lớn cùng một lúc?

     $ một VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float (NAN) str ("\ 0") đúng đúng đúng đúng sai sai
  float (NAN) str ('') đúng đúng đúng đúng sai sai
  float (NAN) str ('+') đúng đúng đúng đúng sai sai
  float (NAN) str ('-') đúng đúng đúng đúng sai sai
  float (NAN) str ('0') đúng đúng đúng đúng sai sai
  float (NAN) str ('01 ') đúng đúng đúng đúng sai sai
  float (NAN) str ('1') đúng đúng đúng đúng sai sai
  float (NAN) str ('false') đúng đúng đúng đúng sai sai
  float (NAN) str ('text') true true true true true false false
  float (NAN) str ('true') đúng đúng đúng đúng sai sai

Bằng nhau và giống hệt nhau:

     $ một VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) NULL (NULL) sai sai đúng đúng đúng đúng đúng
 float (-INF) float (-INF) false false true true true true true
  float (INF) float (INF) false false true true true true đúng

Thấp hơn hoặc lớn hơn:

     $ một VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL (NULL) bool (true) false true true true false false false
 float (-INF) NULL (NULL) đúng sai sai sai sai sai sai
  NULL (NULL) float (1) false true true true false false false
  float (INF) NULL (NULL) đúng sai sai đúng sai sai sai
  float (NAN) NULL (NULL) đúng sai sai sai sai sai sai
  NULL (NULL) int (-1) sai đúng đúng sai sai sai sai
  NULL (NULL) int (1) sai đúng đúng sai sai sai sai
  NULL (NULL) str ("\ 0") sai đúng đúng sai sai sai sai
  NULL (NULL) str ('+') sai đúng đúng sai sai sai sai
  NULL (NULL) str ('-') sai đúng đúng sai sai sai sai
  NULL (NULL) str ('0') sai đúng đúng sai sai sai sai
  NULL (NULL) str ('01 ') sai đúng đúng sai sai sai sai
  NULL (NULL) str ('1') sai đúng đúng sai sai sai sai
  NULL (NULL) str ('false') false true true true false false false
  NULL (NULL) str ('text') false true true true false false false
  NULL (NULL) str ('true') false true true true false false false
   mảng () bool (true) false true true false false false false
 mảng float (-INF) () false true true false false false false
   mảng () float (0) true false false false false false
   mảng () float (1) true false false false false false
  mảng float (INF) () false true true false false false false
  float (NAN) mảng () false true true false false false false
   mảng () int (-1) đúng sai sai sai sai sai sai
   mảng () int (0) đúng sai sai sai sai sai sai
   mảng () int (1) đúng sai sai sai sai sai sai
   mảng () str ("\ 0") đúng sai sai đúng sai sai sai
   str ('') mảng () false true true false false false false
   mảng () str ('+') đúng sai sai đúng sai sai sai
   mảng () str ('-') đúng sai sai đúng sai sai sai
   mảng () str ('0') đúng sai sai đúng sai sai sai
   mảng () str ('01 ') đúng sai sai đúng sai sai sai
   mảng () str ('1') đúng sai sai đúng sai sai sai
   mảng () str ('false') đúng sai sai sai sai sai sai
   mảng () str ('văn bản') đúng sai sai sai sai sai sai
   mảng () str ('true') đúng sai sai đúng sai sai sai
  bool (true) bool (false) true false false false false false false
 float (-INF) bool (false) đúng false false false false false
   float (1) bool (false) true false false false false false false
  float (INF) bool (false) đúng false false false false false false
  float (NAN) bool (false) true false false false false false false
 bool (false) int (-1) false đúng đúng sai sai sai sai
    int (1) bool (false) đúng sai sai sai sai sai sai
 bool (false) str ("\ 0") false đúng đúng sai sai sai sai
 bool (false) str ('+') false đúng đúng sai sai sai sai
 bool (false) str ('-') sai đúng đúng sai sai sai sai
 bool (false) str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') bool (false) đúng sai sai sai sai sai sai
 bool (false) str ('false') false true true false false false false
 str ('văn bản') bool (false) đúng sai sai sai sai sai sai
 str ('true') bool (false) đúng false false false false false false
  bool (true) float (0) true false false true false false false
  bool (true) int (0) đúng sai sai đúng sai sai sai
   str ('') bool (đúng) sai đúng đúng sai sai sai sai
  bool (true) str ('0') đúng sai sai đúng sai sai sai
 float (-INF) float (0) false true true false false false false
 float (-INF) float (1) false true true false false false false
  float (INF) float (-INF) true false false false false false
 float (-INF) int (-1) false true true false false false false
 float (-INF) int (0) false đúng đúng sai sai sai sai
 float (-INF) int (1) false true true false false false false
 float (-INF) str ("\ 0") false true true true false false false
 float (-INF) str ('') false true true true false false false
 float (-INF) str ('+') false true true true false false false
 float (-INF) str ('-') false true true true false false false
 float (-INF) str ('0') false true true true false false false
 float (-INF) str ('01 ') false true true true false false false
 float (-INF) str ('1') false true true true false false false
 float (-INF) str ('false') false true true true false false false
 float (-INF) str ('text') false true true true false false false
 float (-INF) str ('true') false true true true false false false
   float (1) float (0) true false false false false false
  float (INF) float (0) true false false false false false false
   float (0) int (-1) true false false false false false
    int (1) float (0) true false false false false false
   float (0) str ('01 ') false true true false false false false
   str ('1') float (0) đúng sai sai đúng sai sai sai
  float (INF) float (1) true false false false false false false
   float (1) int (-1) true false false false false false false
   float (1) int (0) true false false false false false
   float (1) str ("\ 0") đúng sai sai sai sai sai sai
   str ('') float (1) false true true false false false false
   float (1) str ('+') true false false false false false
   float (1) str ('-') đúng sai sai sai sai sai sai
   float (1) str ('0') đúng sai sai sai sai sai sai
   float (1) str ('false') đúng sai sai sai sai sai sai
 str ('văn bản') float (1) false true true false false false false
 str ('true') float (1) false true true false false false false
  float (INF) int (-1) đúng sai sai sai sai sai sai
  float (INF) int (0) true false false false false false
  float (INF) int (1) đúng sai sai sai sai sai sai
  float (INF) str ("\ 0") đúng sai sai sai sai sai sai
  float (INF) str ('') đúng sai sai đúng sai sai sai
  float (INF) str ('+') đúng sai sai đúng sai sai sai
  float (INF) str ('-') đúng sai sai sai sai sai sai
  float (INF) str ('0') đúng sai sai đúng sai sai sai
  float (INF) str ('01 ') đúng sai sai sai sai sai sai
  float (INF) str ('1') đúng sai sai sai sai sai sai
  float (INF) str ('false') đúng sai sai sai sai sai sai
  float (INF) str ('text') true false false false false false false
  float (INF) str ('true') true false false false false false false
    int (0) int (-1) đúng sai sai sai sai sai sai
    int (1) int (-1) đúng sai sai sai sai sai sai
  str ("\ 0") int (-1) đúng sai sai sai sai sai sai
   str ('') int (-1) đúng sai sai đúng sai sai sai
   str ('+') int (-1) đúng sai sai sai sai sai sai
   str ('-') int (-1) đúng sai sai sai sai sai sai
   str ('0') int (-1) đúng sai sai sai sai sai sai
   int (-1) str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') int (-1) đúng sai sai sai sai sai sai
 str ('false') int (-1) đúng sai sai sai sai sai sai
 str ('văn bản') int (-1) đúng sai sai sai sai sai sai
 str ('true') int (-1) đúng sai sai đúng sai sai sai
    int (1) int (0) đúng sai sai sai sai sai sai
    int (0) str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') int (0) đúng sai sai sai sai sai sai
    int (1) str ("\ 0") đúng sai sai sai sai sai sai
   str ('') int (1) sai đúng đúng sai sai sai sai
    int (1) str ('+') đúng sai sai đúng sai sai sai
    int (1) str ('-') đúng sai sai sai sai sai sai
    int (1) str ('0') đúng sai sai sai sai sai sai
    int (1) str ('false') đúng sai sai sai sai sai sai
 str ('văn bản') int (1) sai đúng đúng sai sai sai sai
 str ('true') int (1) sai đúng đúng sai sai sai sai
   str ('') str ("\ 0") sai đúng đúng sai sai sai sai
   str ('+') str ("\ 0") đúng sai sai sai sai sai sai
   str ('-') str ("\ 0") đúng sai sai sai sai sai sai
  str ("\ 0") str ('0') sai đúng đúng sai sai sai sai
  str ("\ 0") str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') str ("\ 0") đúng sai sai sai sai sai sai
 str ('false') str ("\ 0") đúng sai sai sai sai sai sai
 str ('văn bản') str ("\ 0") đúng sai sai sai sai sai sai
 str ('true') str ("\ 0") đúng sai sai đúng sai sai sai
   str ('') str ('+') sai đúng đúng sai sai sai sai
   str ('') str ('-') sai đúng đúng sai sai sai sai
   str ('') str ('0') sai đúng đúng sai sai sai sai
   str ('') str ('01 ') sai đúng đúng sai sai sai sai
   str ('') str ('1') sai đúng đúng sai sai sai sai
   str ('') str ('false') sai đúng đúng sai sai sai sai
   str ('') str ('văn bản') sai đúng đúng sai sai sai sai
   str ('') str ('true') sai đúng đúng sai sai sai sai
   str ('-') str ('+') đúng sai sai đúng sai sai sai
   str ('+') str ('0') sai đúng đúng sai sai sai sai
   str ('+') str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') str ('+') đúng sai sai đúng sai sai sai
 str ('false') str ('+') đúng sai sai sai sai sai sai
 str ('văn bản') str ('+') đúng sai sai sai sai sai sai
 str ('true') str ('+') đúng sai sai đúng sai sai sai
   str ('-') str ('0') sai đúng đúng sai sai sai sai
   str ('-') str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') str ('-') đúng sai sai sai sai sai sai
 str ('false') str ('-') đúng sai sai sai sai sai sai
 str ('văn bản') str ('-') đúng sai sai sai sai sai sai
 str ('true') str ('-') đúng sai sai đúng sai sai sai
   str ('0') str ('01 ') sai đúng đúng sai sai sai sai
   str ('1') str ('0') đúng sai sai đúng sai sai sai
 str ('false') str ('0') đúng sai sai sai sai sai sai
 str ('văn bản') str ('0') đúng sai sai đúng sai sai sai
 str ('true') str ('0') đúng sai sai đúng sai sai sai
 str ('false') str ('01 ') đúng sai sai sai sai sai sai
 str ('văn bản') str ('01 ') đúng sai sai sai sai sai sai
 str ('true') str ('01 ') đúng sai sai đúng sai sai sai
   str ('1') str ('false') sai đúng đúng sai sai sai sai
 str ('văn bản') str ('1') đúng sai sai sai sai sai sai
 str ('true') str ('1') đúng sai sai đúng sai sai sai
 str ('văn bản') str ('false') đúng sai sai sai sai sai sai
 str ('true') str ('false') đúng sai sai đúng sai sai sai
 str ('true') str ('text') true false false false false false

$a > $b > $cCâu hỏi hóc búa khi: $akhông lớn hơn $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)> str ('a')
A <C: str ('')> float (NAN)> str ('1')
A <C: str ('')> float (NAN)> str ('A')
A <C: str ('')> float (NAN)> str ('0')
A <C: str ('a')> str ('')> float (NAN)
A <C: str ('a')> str ('1')> float (NAN)
A <C: str ('a')> str ('A')> float (NAN)
A <C: str ('a')> str ('0')> float (NAN)
A <C: str ('0')> str ('')> float (NAN)
A == C: bool (đúng)> str ('')> float (NAN)
A == C: bool (đúng)> str ('')> float (-INF)
A == C: bool (đúng)> str ('')> int (-1)
A == C: bool (đúng)> str ('')> float (-1)
A == C: bool (true)> mảng ()> float (NAN)
A == C: bool (true)> mảng ()> float (INF)
A == C: bool (true)> mảng ()> float (-INF)
A == C: bool (true)> mảng ()> str ('a')
A == C: bool (true)> mảng ()> int (1)
A == C: bool (true)> mảng ()> float (1)
A == C: bool (true)> mảng ()> str ('1')
A == C: bool (true)> mảng ()> str ('A')
A == C: bool (true)> mảng ()> int (-1)
A == C: bool (true)> mảng ()> float (-1)
A == C: bool (đúng)> int (0)> float (-INF)
A == C: bool (đúng)> int (0)> int (-1)
A == C: bool (đúng)> int (0)> float (-1)
A == C: bool (đúng)> str ('0')> float (NAN)
A == C: bool (đúng)> str ('0')> float (-INF)
A == C: bool (đúng)> str ('0')> int (-1)
A == C: bool (đúng)> str ('0')> float (-1)
A == C: bool (đúng)> float (0)> float (-INF)
A == C: bool (đúng)> float (0)> int (-1)
A == C: bool (đúng)> 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 ('a')> str ('1')> int (0)
A == C: str ('a')> str ('1')> float (0)
A == C: str ('')> float (-INF)> NULL (NULL)
A == C: str ('')> float (-INF)> bool (sai)
A == C: str ('')> int (-1)> NULL (NULL)
A == C: str ('')> int (-1)> bool (sai)
A == C: str ('')> float (-1)> NULL (NULL)
A == C: str ('')> float (-1)> bool (sai)
A == C: mảng ()> float (NAN)> NULL (NULL)
A == C: mảng ()> float (NAN)> bool (false)
A == C: mảng ()> float (INF)> NULL (NULL)
A == C: mảng ()> float (INF)> bool (false)
A == C: mảng ()> float (-INF)> NULL (NULL)
A == C: mảng ()> float (-INF)> bool (false)
A == C: mảng ()> str ('a')> NULL (NULL)
A == C: mảng ()> str ('a')> bool (sai)
A == C: mảng ()> int (1)> NULL (NULL)
A == C: mảng ()> int (1)> bool (sai)
A == C: mảng ()> float (1)> NULL (NULL)
A == C: mảng ()> float (1)> bool (false)
A == C: mảng ()> str ('1')> NULL (NULL)
A == C: mảng ()> str ('1')> bool (sai)
A == C: mảng ()> str ('A')> NULL (NULL)
A == C: mảng ()> str ('A')> bool (sai)
A == C: mảng ()> str ('0')> NULL (NULL)
A == C: mảng ()> int (-1)> NULL (NULL)
A == C: mảng ()> int (-1)> bool (sai)
A == C: mảng ()> float (-1)> NULL (NULL)
A == C: mảng ()> float (-1)> bool (false)
A == C: str ('')> float (NAN)> bool (sai)
A == C: str ('')> float (NAN)> NULL (NULL)
A == C: str ('A')> str ('1')> int (0)
A == C: str ('A')> str ('1')> float (0)
A == C: int (0)> float (-INF)> NULL (NULL)
A == C: int (0)> float (-INF)> bool (sai)
A == C: int (0)> int (-1)> NULL (NULL)
A == C: int (0)> int (-1)> bool (sai)
A == C: int (0)> float (-1)> NULL (NULL)
A == C: int (0)> float (-1)> bool (sai)
A == C: str ('0')> float (NAN)> bool (sai)
A == C: str ('0')> float (-INF)> bool (sai)
A == C: str ('0')> int (-1)> bool (sai)
A == C: str ('0')> float (-1)> bool (sai)
A == C: float (0)> float (-INF)> NULL (NULL)
A == C: float (0)> float (-INF)> bool (sai)
A == C: float (0)> int (-1)> NULL (NULL)
A == C: float (0)> int (-1)> bool (sai)
A == C: float (0)> float (-1)> NULL (NULL)
A == C: float (0)> float (-1)> bool (sai)
A === C: str ('0')> float (NAN)> str ('0')
A === C: str ('')> float (NAN)> str ('')
A === C: str ('a')> float (NAN)> str ('a')
A === C: str ('1')> float (NAN)> str ('1')
A === C: str ('A')> float (NAN)> str ('A')

So sánh chuỗi thú vị: 'Nữ hoàng' >'Vua' >'Jack' >'Ace'

Ngoài ra kiểm tra các bảng so sánh kiểu PHP bao gồm các cặp:

  • isset()is_null()
  • if()empty()
  • boolean ==vs.===

Kiểm tra sự khác biệt giữa các phiên bản PHP trực tiếp tại. http://3v4l.org/MAfDu .


26
+1 hãy để một mình các "bảng" có thể cuộn với các tiêu đề cột cố định - ý tưởng tiện lợi;)
hakre

Có cần phải sử dụng toán tử nghiêm ngặt khi đúc kiểu? Tôi có nghĩa là bạn đã viết if ( (string)$a===(string)$b )nhưng không chính xác như if ( (string)$a==(string)$b )thế này?
Voitcus

@Voitcus có cho cả hai loại diễn viên (string)1==(string)'01'-> bool(true)và cho kiểu tung hứng (1 . '')=='01'-> bool(true)không hoàn toàn giống như ===khi bạn nhận được bool(false)trên cả hai tài khoản
CSᵠ

1
Một nit-pick: các giá trị bát phân không được "chuyển đổi khi gán", chúng được trình biên dịch diễn giải, nó phải biến ASCII thành các số nhị phân thực tế.
IMSoP

INFINITY is equal to INFINITY which is mathematically incorrect!là một tuyên bố gây tranh cãi quyết định. Cũng lưu ý rằng NaNtheo quy ước không lớn hơn, nhỏ hơn hoặc bằng bất cứ thứ gì trong bất kỳ ngôn ngữ lập trình nào mà tôi biết.
DaveRandom

22

Sau khi bạn sửa phần thứ hai cho câu hỏi của bạn, tôi để lại câu trả lời cho phần đó cho những người khác. Tôi chỉ muốn đưa ra câu trả lời đáng ngạc nhiên nhất cho phần đầu tiên của câu hỏi của bạn, tức là, liệu có một ví dụ về các toán tử <>toán tử không nội động. Nó đây rồi

Đây là tất cả true:

"10" < "1a"
"1a" < "2"
"10" > "2"

Nếu <$a < $bbắc cầu ( ∧ $b < $c$a < $c), dòng cuối cùng sẽ là

"10" < "2"

nhưng PHP cố gắng tử tế (?!) và diễn giải các chuỗi như số bất cứ khi nào có thể.

Nó chỉ ra rằng, vì tính không linh hoạt ở trên, sort()có thể sắp xếp các phần tử giống nhau thành một thứ tự khác nhau tùy thuộc vào thứ tự đầu vào của chúng, ngay cả khi không có hai phần tử nào== (và không có phần tử nào là NAN). Tôi đã chỉ ra điều này trong một bình luận để sắp xếp () , bản chất của nó là:

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )

1
bình luận trước đó đề cập đến một phần của câu trả lời (liên quan đến phần thứ hai của câu hỏi) mà tôi đã xóa trong khi đó
Walter Tross

Đã xóa nó ngay bây giờ;) Và sort()bảng mới đẹp , chọn nó cũng cho ý nghĩa thực tế khi viết bài đăng trên blog có liên quan Giá trị PHP lớn nhất . Cảm ơn một lần nữa cho câu trả lời của bạn.
hakre

Có nghĩa là người ta nên sử dụng usortbất cứ khi nào có thể?
Voitcus

2
@Voitcus: Tôi đoán bạn có nghĩa là usort($arr, 'strcmp'). Điều này hoạt động (đối với chuỗi, tất nhiên), nhưng tốt nhất nên sử dụng sort($arr, SORT_STRING).
Walter Tross

@WalterTross Ý tôi là luôn luôn sử dụng chức năng của riêng bạn (không chỉ cho chuỗi) để đảm bảo nó luôn đúng
Voitcus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.