12/08/2018, 11:23

Variable Comparison in PHP

Cách đây 4 tháng, mình đã từng có một bài viết mang tên "Variables Comparison in Javascript", bài viết phân tích về tính falsy và truthy trong Javascript, cũng như những cạm bẫy thường gặp khi thực hiện các phép so sánh thông thường. Lần này mình tiếp tục thực hiện chủ đề tương tự, nhưng với một ...

Cách đây 4 tháng, mình đã từng có một bài viết mang tên "Variables Comparison in Javascript", bài viết phân tích về tính falsy và truthy trong Javascript, cũng như những cạm bẫy thường gặp khi thực hiện các phép so sánh thông thường.

Lần này mình tiếp tục thực hiện 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ể sử dụng Framework này, Framework kia, nhưng liệu bạn đã thực sự hiểu hết về meta của nó, bạn có thực sự nắm rõ được tính falsy và truthy, hay những phép so sánh của PHP.

Do you really know PHP ?

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

Chú ý: Phiên bản PHP được sử dụng là phiên bản mới nhất ở thời điểm hiện tại, tháng 9/2015, tức PHP 5.6 nhé

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 bản chất tại sao nó lại như vậy thì có lẽ bạn cũng đã nắm rõ hết được những gì mà bài viết này đề sẽ cập đến rồi. Còn ngược lại, hãy dành chút thời gian để đọc và tìm hiểu về những điều sẽ được giới thiệu dưới đây, bạn sẽ tự tìm được lời giải thích cho từng đáp án.

Let's start!

Để trả lời được 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õ được về những kiểu giá trị có trong PHP.

Các kiểu giá trị trong PHP

  • String
  • Integer (Hay Long)
  • Float (Hay double)
  • Boolean
  • Array
  • Object
  • NULL
  • Resource

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

  • Kiểu Boolean gồm 2 giá trị là true và false.
  • Kiểu Null chỉ gồm duy nhất một giá trị là null.

Cũng giống như Javascript hay nhiều ngôn ngữ lập trình khác, để so sánh "bằng" trong PHP, ta có thể dùng == và ===.

===, Strict Comparison hay Strict Equal, sẽ so sánh cả kiểu giá trị của 2 bên. Nếu 2 bên có kiểu giá trị khác nhau thì phép toán sẽ trả về giá trị false. Phép toán === 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 ==, Loose Comparison 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ể dùng phép ép kiểu giống với C để đưa một biến từ kiểu giá trị này thành kiểu giá trị khác:

(boolean) 1 // true
(string) 10 // "10"
(int) "100" // 100
(int)[1] // 1

Những giá trị được coi là false

Đó là những giá trị khi được ép về kiểu Boolean sẽ cho giá trị là false. Bao gồm:

  • false
  • 0
  • 0.0
  • "" (Xâu rỗng)
  • "0"
  • [] (Mảng không có phần tử)
  • null (Gồm cả những biến không được set giá trị)
  • SimpleXML objects được tạo từ tag rỗng

Ví dụ

0.0 == false; // true
"0" == false; // true
$a = new SimpleXML('<div></div>');
$a == false; // true

Ngoài những giá trị là false kể trên, thì tất cả các giá trị khác đều được coi là true.

Trong phần này, chúng ta sẽ tìm hiểu về một số trường hợp, hay quy tắc đặc biệt khi thực hiện các phép so sánh == hay <, > trong PHP. Một số trong đó có thể gây bất ngờ cho bạn đấy.             </div>
            
            <div class=

0