Vài thứ hơi lạ trong PHP
Bài đăng này đã không được cập nhật trong 3 năm
Mở đầu
Dạo gần đây mình hay được tiếp xúc với mấy câu hỏi cơ bản lẫn xoắn não về PHP. Đúng thật là nếu không tìm hiểu kỹ thì khó mà có thể trả lời được. Và khi tìm hiểu rồi thì thấy PHP thật là... không biết dùng từ gì để miêu tả luôn =))
Theo các bạn thì "01e4"
và "001e4"
có bằng (==
) nhau không?
"01e4"
và "001e4"
Chúng ta bắt đầu với một cái gì đó đơn giản và không gây tranh cãi. Nếu bạn có hai chuỗi chứa một số ký tự khác nhau, tất nhiên là chúng không thể được coi là bằng nhau. Các số 0 ở đầu 2 chuỗi được tính vào chuỗi và nó vẫn được coi là quan trọng vì đây là string chứ không phải number. Và do đó "01a4" != "001a4"
trả về true
.
Vậy thì với "01e4" == "001e4"
thì kết quả sẽ như thế nào?
Người ta bảo, PHP không thích string, nó sẽ tìm kiếm bất kỳ lý do gì nó có thể tìm thấy để xử lý các giá trị của bạn như là những con số. Và nó đã tìm thấy lý do ở đây, 0, 1, 4, e
nó coi là các ký tự trong hệ hexadecimal
. Từ đây 2 string trên không còn là string nữa )) mà nó là số trong ký hiệu khoa học (numbers in scientific notation). Nó cũng không quan tâm đến chuyện bạn đã sử dụng dấu quotes
để cho nó biết đây là string.
Do đó, "01e4" == "001e4"
sẽ trả về true vì số 0 ở đầu sẽ chẳng có tác dụng gì vì nó đang là number mà. Thử với "01e4" == "10000"
cũng cho kết quả tương tự vì đây là 2 con số tương đương nhau. Không tin à?
17
và 017
Có thể là 18 và 018 hoặc 99 và 099.... nhưng tự nhiên nghĩ ra con số này thì dùng làm ví dụ thôi. Thế theo các bạn thì 17
và 017
có bằng nhau không??? Thử luôn nhé :v
Có cái gì đó sai sai ở đây =)) không phải máy tính của tớ hỏng đâu, mà đúng là như vầy đó. Ở đây không phải là string nữa mà là number cmnr, và đối với PHP mà number có số 0 ở đầu thế này, nó coi là số trong hệ octal
, và 017
trong hệ octal
sẽ là 15
trong hệ decimal
, nhìn nè:
Thế còn "0017"
và 0017
Thật khốn nạn ở chỗ, trong thì nó không tự động chuyển ký tự có số 0 ở đầu sang octal
như nó đã chuyển string ở ví dụ trên sang hexa
, thế nên ta có "0017"
và 0017
không bằng nhau ))
"0x001e4"
và 0x01e4
Thế khi chúng ta cố tình bảo cho PHP là string này chứa số hệ hexa
thì nó làm gì?
Có vẻ không như chúng ta nghĩ ))
Kết Luận
- Còn có nhiều điều mà chúng ta cần khám phá về PHP, và chúng ta sẽ thấy nó rất thú vị.
All rights reserved