Sai trong php

Cách đây 4 tháng, mình đã từng có một bài viết mang tên "So sánh biến trong Javascript", bài viết phân tích về tính

NAN == true; // true
null < NAN; // true
"0" < true; // true
0 và
NAN == true; // true
null < NAN; // true
"0" < true; // true
1 trong Javascript, cũng như những cạm bẫy thường gặp khi thực hiện phép so sánh thông thường

Lần này mình tiếp tục thực hiện các chủ đề tương tự, nhưng với một ngôn ngữ khác. PHP, ngôn ngữ lập trình web phổ biến nhất thế giới hiện nay

Bạn có thể code php, có thể áp dụng framework này, framework kia, nhưng hiện tại đã hiểu hết về meta của nó, bạn có biệt thự rõ ràng về tính ______01, Hay nhữnh phép cho phép như vậy

Bạn có thực sự biết PHP?

Bạn có thể giải các câu đố sau không?

Tương tự với bài viết "So sánh biến trong Javascript" trước đây, mình sẽ mở lại đầu bài viết về PHP lần này bằng một số "câu đố" nhỏ nho. Câu hỏi rất đơn giản thôi, Các phép toán dưới đây trả về

NAN == true; // true
null < NAN; // true
"0" < true; // true
4 hoặc
NAN == true; // true
null < NAN; // true
"0" < true; // true
5

Chuý. Phiên bản PHP được sử dụng là phiên bản mới nhất tại thời điểm hiện tại, tháng 9/2015, tức PHP 5. 6 nhe

false == false // It will return true. Too easy, right ? :D

// But how about the following ? TRUE or FALSE ?
// Các phép so sánh sau trả về true hay false
1 == "1"
0 == "0"
"0" == "-0"
0 == false
"0" == false
"-0" == false
"0.0" == false
10 == "10tran duc thang 10"
"thang" == 0
"thang" == "0"
[] == false
null == []
null == ""
null == 0
null < -1
[] == 0
[] == ""
1 == "1 "
"1" == "1 "
"10" == "                    10"
"100" == "1e2"
"1000"  == "0x3e8"
"345" == "0345"
345 == 0345
"345" < "0346"
[1] == 1
(int) [1] == 1
(int) [0] == 0
false < -INF
false < NAN
true < INF
[1] == [1]
[1, 2] == [1 => 2, 0 => 1]
[1, 2] === [1 => 2, 0 => 1]
[1, 2] > 3
[1, 2] > "[1, 2]"
[1, 2] > [3]
[1, 2] > [2, 1]
(object) [1] > [1]

Nếu bạn có thể trả lời đúng hết, và hiểu ược điểm tại sao nó lại như vậy thì có đng đm rõ hết ược nhữc nhữm gì mà bài viế sẽ cập nhật rồi. Còn ngược lại, hãy dành chia sẻ ọi thuật và tìm hiểu về những ượu điều sẽ ược giới thiệu dưới đây, bạn sẽ tìm ược lời thích cho từ câu hỏi

Hãy bắt đầu

các loại biến

Để trả lời cho những câu hỏi trên thì trước hết ta cần phải tìm hiểu và nắm rõ về những kiểu giótron PHP á trug giótron

Các loại giá trị trong PHP

  • thong
  • Số Nguyên (HayLong)
  • Phao (Hay đôi)
  • boolean
  • mảng
  • các đối tượng
  • SỐ KHÔNG
  • tài nguyên

Một số điều cần lưu ý

  • Boolean Type bao gồm 2 value là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4 và
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5
  • Kiểu Null chỉ bao gồm duy nhất một giá trị là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    8

Cũng giống như Javascript hoặc nhiều ngôn ngữ lập trình khác, để so sánh "bằng" trong PHP, ta có thể sử dụng

NAN == true; // true
null < NAN; // true
"0" < true; // true
9 và
NAN == true; // true
null < NAN; // true
"0" < true; // true
10

NAN == true; // true
null < NAN; // true
"0" < true; // true
10, So sánh nghiêm ngặt hoặc Bình đẳng nghiêm ngặt, sẽ so sánh cả hai loại giá trị của 2 bên. Nếu 2 bên có các kiểu giá trị khác nhau thì phép toán sẽ trả lại giá trị
NAN == true; // true
null < NAN; // true
"0" < true; // true
5. Máy tính toán
NAN == true; // true
null < NAN; // true
"0" < true; // true
10 là rất minh bạch và dễ sử dụng, ít gây hiểu nhầm hay khó khăn gì cho lập trình viên

Còn phép so sánh

NAN == true; // true
null < NAN; // true
"0" < true; // true
9, So sánh lỏng lẻo hay Loose Equal, thì sẽ tìm cách đưa 2 bên về cùng một kiểu giá trị rồi thực hiện phép so sánh

Ta có thể sử dụng ép kiểu giống với C để đưa ra một biến từ kiểu giá trị này thành kiểu giá trị khác

NAN == true; // true
null < NAN; // true
"0" < true; // true
6

The value are coi la NAN == true; // true null < NAN; // true "0" < true; // true 5

Đó là những giá trị khi được ép về kiểu Boolean sẽ cho giá trị là

NAN == true; // true
null < NAN; // true
"0" < true; // true
5. Bảo gom

  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    18
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    19
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    20 (Xâu trống)
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    21
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    22 (Mảng không có phần tử)
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    8 (Gồm cả những biến không được đặt giá trị)
  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    24 được tạo từ thẻ rỗng

vì làm

NAN == true; // true
null < NAN; // true
"0" < true; // true
7

Ngoài các giá trị là

NAN == true; // true
null < NAN; // true
"0" < true; // true
5 kể trên, thì tất cả các giá trị khác đều được coi là
NAN == true; // true
null < NAN; // true
"0" < true; // true
4

So sánh trong PHP

Trong phần này, chúng ta sẽ tìm hiểu về một số trường hợp, hay các quy tắc đặc biệt khi thực hiện các phép so sánh

NAN == true; // true
null < NAN; // true
"0" < true; // true
9 hay ______2. Một số trong đó có thể gây bất ngờ cho bạn đấy.
Sai trong php

Null vs String

  • NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    8 are convert về chuỗi trống
NAN == true; // true
null < NAN; // true
"0" < true; // true
4

Boolean và Null

  • Các biến khi so sánh với
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    51 hay
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    8 thì sẽ bị ép về kiểu
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    51. And when so sánh 2 giá trị kiểu
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    51 với nhau thì
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5 <
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4
NAN == true; // true
null < NAN; // true
"0" < true; // true

Chuỗi vs Chuỗi

  • phép so sánh chuỗi với chuỗi sử dụng _______09 nhìn qua thì có vẻ đơn giản, bởi 2 bên đã cùng một loại rồi, ta chỉ cần xem các giá trị có giống nhau không mà thôi. Thế nhưng mọi thứ lại không chắc chắn như vậy, double when so sánh 2 Chuỗi thì chúng lại bị ép về kiểu. Số nguyên có số float =)).
    Khe hạn như cho phép so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    58 trả về.
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4, default 2 string that is other nhau (wtf, (facepalm)).
  • Thậm chí một String có chữ
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    50 hay
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    51 cũng có thể bị ép về kiểu số nếu có thể (facepalm)
NAN == true; // true
null < NAN; // true
"0" < true; // true
1
  • Hơn nữa, nếu trong một chuỗi là một số và có dấu cách hoặc tab ở phía sau, thì chúng sẽ bị loại bỏ
NAN == true; // true
null < NAN; // true
"0" < true; // true
2
  • Tuy nhiên, nếu có dấu cách, tab. , hay bất kỳ ký tự nào ở phía sau thì chúng ta sẽ không bị ép về giá trị số để so sánh nữa. v
NAN == true; // true
null < NAN; // true
"0" < true; // true
5
  • Phép so sánh chuỗi với chuỗi sử dụng dụ__09 Thật sự rất nguy hiểm và trả lại nhiều người không muốn, thế nên ngừng sử dụng nó khi bạn không biết chắc chắn là như vậy nhé))

Số vs Chuỗi

  • String will be ép về value number (Integer or Float)
  • Nếu một chuỗi bắt đầu bằng một số thì nó sẽ có giá trị là số đó
  • Nếu một chuỗi không bắt đầu bằng một số thì nó sẽ có giá trị là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    18
NAN == true; // true
null < NAN; // true
"0" < true; // true
5

Mảng vs Mảng

  • Hai mảng là "bằng nhau" theo phép so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9 nếu chúng có cặp khóa và giá trị là "bằng nhau". Việc so sánh khóa, giá trị cũng được thực hiện bằng cách cho phép so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9. Thứ tự của cặp key, value trong mảng không gây ảnh hưởng gì
NAN == true; // true
null < NAN; // true
"0" < true; // true
5
  • Hai mảng là "bằng nhau" theo phép so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    10 nếu chúng có cặp khóa và giá trị là "bằng nhau". Việc so sánh khóa, giá trị cũng được thực hiện bằng cách cho phép so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    10. Thứ tự của các cặp khóa, giá trị trong mảng khác nhau sẽ làm cho các mảng được coi là khác nhau
NAN == true; // true
null < NAN; // true
"0" < true; // true
60
  • Khi so sánh 2 mảng bằng phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    29 hay
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    28, thì mảng nào có nhiều phần tử hơn thì sẽ lớn hơn. Nếu 2 mảng cùng số phần tử và key giống nhau thì sẽ so sánh số lần các phần tử với nhau. (Nếu các khóa khác nhau thì sẽ không so sánh được, phép toán sẽ trả về
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5)
NAN == true; // true
null < NAN; // true
"0" < true; // true
61

Đối tượng vs Đối tượng

  • Thể hiện của các lớp khác nhau thì không so sánh được
  • Các đối tượng "bằng nhau" theo phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9 nếu chúng là thể hiện của cùng một Lớp, và có cùng các thuộc tính và giá trị của các thuộc tính cũng "bằng nhau";
  • Các đối tượng "bằng nhau" theo phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    10 nếu và chỉ nếu chúng cùng trỏ đến một thể hiện
NAN == true; // true
null < NAN; // true
"0" < true; // true
62

Khác

  • Một mảng sẽ lớn hơn (
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    29) mọi giá trị khác mà không phải là boolean, mảng hay đối tượng. Phép toán so sánh
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    29 giữa mảng và nhìn kia là integer, float, string, null. thì đều trả về
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4, trừ việc
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    56 trả về
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4, và do đó
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    58 trả về
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5
  • Mảng có thể ép về kiểu số, trong đó mảng trống thì cho giá trị
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    18, ngoài ra cho giá trị
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    601
  • Một đối tượng sẽ lớn hơn (
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    29) một mảng
NAN == true; // true
null < NAN; // true
"0" < true; // true
63 Sự thật thú vị
  • Phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9 trong PHP không có tính phản thân (reflexive), tức thời
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    604 không phải lúc nào cũng đúng =)). Ví dụ
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    605 sẽ trả lại cho
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5
  • Phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9 trong PHP có tính đối xứng (đối xứng), tức là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    608 và
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    609 sẽ trả về cùng một kết quả
  • Phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    9 trong PHP không có tính chất bắc cầu (transitive), tức là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    608 và
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    612 trả về cho
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4 nhưng
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    614 ______a chắc chắn đã trẁ 04.__ vỻ04.__. vì làm
NAN == true; // true
null < NAN; // true
"0" < true; // true
64
  • Phép toán _______1616 (Hay _______1617) Trong PHP KHông Có tính phản đối (anti-symmetric), tức
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    618 Và _____1619 ề
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    4 NHưA CHưC ______1608 đ_____.
NAN == true; // true
null < NAN; // true
"0" < true; // true
65
  • Phép toán
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    616, hay
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    28 đều không có tính chất bắc cầu (transitive)
  • Phép toán ______1616, hay _______228 điều không có tính toàn bộ (total), tức cả _______1618 và ______1619 điều có thể trả lại cho
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    5, hay cả
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    608 C)
NAN == true; // true
null < NAN; // true
"0" < true; // true
66
  • Trong phiên bản 7, PHP có giới hạn cấp phép toán mới, đó là
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    633. Phép so sánh ________ 1634 sẽ trả về -1 nếu ________ 1630, trả về 0 nếu
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    608 và trả về 1 nếu
    NAN == true; // true
    null < NAN; // true
    "0" < true; // true
    
    637
  • Chắc chắn bạn đã từng sử dụng ternary Operation, toán tử 3 ngôi
NAN == true; // true
null < NAN; // true
"0" < true; // true
67

_________________________________________________________Magic_numable_table_to__

NAN == true; // true
null < NAN; // true
"0" < true; // true
639

  • Cũng liên quan đến Ternary Operation, theo bạn cho phép thanh toán sau trả lại kết quả gì ?
NAN == true; // true
null < NAN; // true
"0" < true; // true
68

Mới nhìn qua, có thể bạn sẽ trả kết quả là _______05, với tự nhiên thực hiện phép toán là ______1641, tuy nhiên thứ tự đđ phải là ______1642, và do đó, phép toán sẽ __

Những câu trả lời

Dưới đây là câu trả lời cho những câu hỏi được đưa ra ở đầu bài viết

Nếu bạn đã đọc hết các phần phía trên rồi thì chắc chắn có thể hiểu được tại sao nó lại ra được câu trả lời như dƑới đớ. Còn nếu câu nào mà bạn vẫn chưa hiểc nguyên nhân thì điu đó có nghĩa là bạn đã sa thải điều gì ải đó, kéo lên đọc lại thôi)

Nếu có thắc mắc gì hãy để lại tin nhắn ở phần bình luận nhé

NAN == true; // true
null < NAN; // true
"0" < true; // true
69

Bài viết chắc chắn vẫn chưa thể giải quyết hết các vấn đề trong phép so sánh phép toán trong PHP. Ngoài ra nhiều chỗ mình cũng viết dựa trên kinh nghiệm và những gì mình biết. Có thể còn nhiều chỗ còn sót lại, hy vọng nhận được ý kiến ​​đóng góp của các bạn