ฉันมีคำถามเกี่ยวกับNULLใน PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
ทำไมฉันเห็นเป็นโมฆะเมื่อ$aเป็นสตริงว่างเปล่า นั่นเป็นข้อบกพร่องหรือไม่?
ฉันมีคำถามเกี่ยวกับNULLใน PHP:
$a = '';
if($a == NULL) {
echo 'is null';
}
ทำไมฉันเห็นเป็นโมฆะเมื่อ$aเป็นสตริงว่างเปล่า นั่นเป็นข้อบกพร่องหรือไม่?
คำตอบ:
สิ่งที่คุณกำลังมองหาคือ:
if($variable === NULL) {...}
===หมายเหตุ
เมื่อใช้งาน==ในขณะที่คุณทำ, PHP ถือว่าเป็นโมฆะ , เท็จ , 0ที่ว่างสตริงและที่ว่างเปล่าอาร์เรย์ที่เท่าเทียมกัน
== nullจับคู่สตริงว่างและไม่ใช่เพียง null หรือ undefined
$a = ''เป็นที่ว่างเปล่าstring, falseเป็นแบบบูล, $a = 0;เป็นจำนวนเต็มและจากประเภทnull nullสิ่งที่ OP บอกคือ PHP จะใช้เธรดเป็นค่า "เหมือนกัน" แต่ไม่ใช่ประเภท "เหมือนกัน" ดังนั้นการตรวจสอบอย่างเข้มงวด ===จะตรวจสอบประเภทและล้มเหลวหากคุณใช้ที่แตกต่างกัน นั่นคือเหตุผลที่คุณควรสอดคล้องในค่าตอบแทนของคุณ หากคุณ normaly กลับสตริงในวิธีเหมือนgetName()คุณไม่ควรจะได้รับnullเมื่อมันว่างเปล่า แต่แนวโน้ม emtpy สตริง $user->getName() === ''หรือหรือ$user->getId() === 0 $user->isActive === falseพฤติกรรมที่ตั้งใจ!
เป็นที่แสดงในตารางต่อไปนี้empty($foo)จะเทียบเท่ากับ$foo==nullและมีฟังก์ชั่นเดียวกันของis_null($foo) $foo===nullตารางยังแสดงค่าที่ยุ่งยากบางประการเกี่ยวกับการnullเปรียบเทียบ (ϕ หมายถึงตัวแปรที่ไม่มีการกำหนดค่าเริ่มต้น)
empty is_null
==null ===null isset array_key_exists
ϕ | T | T | F | F
null | T | T | F | T
"" | T | F | T | T
[] | T | F | T | T
0 | T | F | T | T
false | T | F | T | T
true | F | F | T | T
1 | F | F | T | T
\0 | F | F | T | T
ฉันไม่เคยใช้empty()และis_null()ฟังก์ชั่น การใช้การเปรียบเทียบแบบง่าย ๆ นั้นมีความคลุมเครือน้อยกว่าเร็วกว่าและสะอาดกว่า โดยเฉพาะอย่างยิ่งจะมีวงเล็บปีกกาหยิกให้น้อยลง
เช่นif($x==null || $y==null)vsif(is_null($x) || is_null($y))
==null ===null
ตรวจสอบ==กับ===
'' == NULLจะกลับมาจริง
0 == NULLจะกลับมาจริง
false == nullจะกลับมาจริง
อยู่ที่ไหน
'' === NULLจะกลับเท็จ
0 === NULLจะกลับมาเท็จ
false === NULLจะกลับเท็จ
ไม่มันไม่ใช่ข้อผิดพลาด ดูที่การเปรียบเทียบแบบหลวมกับตาราง== ( ตารางที่สอง) ซึ่งแสดงผลลัพธ์ของการเปรียบเทียบแต่ละค่าในคอลัมน์แรกกับค่าในคอลัมน์อื่น ๆ :
TRUE FALSE 1 0 -1 "1" "0" "-1" NULL array() "php" ""
[...]
"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
มีคุณสามารถเห็นได้ว่าเป็นสตริงว่าง""เมื่อเทียบกับfalse, 0, NULLหรือ""จะให้ผลผลิตที่แท้จริง
คุณอาจต้องการใช้is_null [เอกสาร]แทนหรือเปรียบเทียบอย่างเข้มงวด (ตารางที่สาม)
0เมื่อหล่อสตริง: codepad.org/qi40SG3E (int)"php" == 0ดังนั้น
ถ้าคุณใช้==, PHP nullถือว่าเป็นสตริงว่างหรืออาร์เรย์เป็น ที่จะทำให้ความแตกต่างระหว่างnullและemptyอาจใช้หรือ=== is_nullดังนั้น:
if($a === NULL) หรือ if(is_null($a))
$variableเท่านั้น สิ่งที่คุณต้องการคือ:$variable == null(หมายเหตุ==)