php ว่างเปล่าหรือเปล่า?


208

ฉันมีคำถามเกี่ยวกับNULLใน PHP:

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

ทำไมฉันเห็นเป็นโมฆะเมื่อ$aเป็นสตริงว่างเปล่า นั่นเป็นข้อบกพร่องหรือไม่?

คำตอบ:


348

สิ่งที่คุณกำลังมองหาคือ:

if($variable === NULL) {...}

===หมายเหตุ
เมื่อใช้งาน==ในขณะที่คุณทำ, PHP ถือว่าเป็นโมฆะ , เท็จ , 0ที่ว่างสตริงและที่ว่างเปล่าอาร์เรย์ที่เท่าเทียมกัน


13
เท็จเงื่อนไขของคุณตรงกับค่าเริ่มต้นและ null $variableเท่านั้น สิ่งที่คุณต้องการคือ: $variable == null(หมายเหตุ==)
โทมัสลอเรนท์

6
@ThomasLAURENT นั่นคือสิ่งที่ OP กำลังมองหาพวกเขาสงสัยว่าทำไม== nullจับคู่สตริงว่างและไม่ใช่เพียง null หรือ undefined
Godwin

3
ทำให้ความผิดพลาดของฉันหมดไป แต่ประโยคสุดท้ายของคุณทำให้ฉันคิดว่า NULL, false, 0 และ "" เท่ากันอย่างเคร่งครัดซึ่งผิดสำหรับความเข้าใจผิด
โทมัสลอเรนต์

3
@ James เป็นพฤติกรรมที่ตั้งใจไว้ใน PHP มันยังคงเป็นจริงแม้ในปี 2560 และจะเป็นจริงเป็นเวลานานที่ฉันคิดว่า
Defrag

1
$a = ''เป็นที่ว่างเปล่าstring, falseเป็นแบบบูล, $a = 0;เป็นจำนวนเต็มและจากประเภทnull nullสิ่งที่ OP บอกคือ PHP จะใช้เธรดเป็นค่า "เหมือนกัน" แต่ไม่ใช่ประเภท "เหมือนกัน" ดังนั้นการตรวจสอบอย่างเข้มงวด ===จะตรวจสอบประเภทและล้มเหลวหากคุณใช้ที่แตกต่างกัน นั่นคือเหตุผลที่คุณควรสอดคล้องในค่าตอบแทนของคุณ หากคุณ normaly กลับสตริงในวิธีเหมือนgetName()คุณไม่ควรจะได้รับnullเมื่อมันว่างเปล่า แต่แนวโน้ม emtpy สตริง $user->getName() === ''หรือหรือ$user->getId() === 0 $user->isActive === falseพฤติกรรมที่ตั้งใจ!
Cagatay Ulubay

225

เป็นที่แสดงในตารางต่อไปนี้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))


2
ไม่มี "0" และ "0.0" ในตาราง พวกเขาทำให้สิ่งต่าง ๆ ยุ่งยากโดยเฉพาะอย่างยิ่งว่างเปล่า () นั่นเป็นเหตุผลที่ฉันหลีกเลี่ยงการใช้ที่ว่างเปล่า ()
datasn.io

1
@PHPst ยึดตามตารางที่คุณแสดงดังนั้นรหัส php ของสิ่งที่คุณเรียกว่า 'การเปรียบเทียบแบบง่าย' คืออะไร
Chetabahana

@hyip และ==null ===null
PHPst

นี่ควรเป็นคำตอบที่สมบูรณ์ที่สุด ขอบคุณ
pgr

@PHPst คุณพูดว่าการเปรียบเทียบแบบง่าย ๆ นั้นมีความคลุมเครือน้อยกว่า คุณช่วยยกตัวอย่างการใช้การเปรียบเทียบแบบง่าย ๆ แทน NULL empty () ฯลฯ ได้
ไหม

28

ตรวจสอบ==กับ===

'' == NULLจะกลับมาจริง
0 == NULLจะกลับมาจริง
false == nullจะกลับมาจริง

อยู่ที่ไหน

'' === NULLจะกลับเท็จ
0 === NULLจะกลับมาเท็จ
false === NULLจะกลับเท็จ


ผ่านการทดสอบและถูกต้อง '' == null (จริง) ขณะที่ '' === null (false)
TheLegendaryCopyCoder

18

ไม่มันไม่ใช่ข้อผิดพลาด ดูที่การเปรียบเทียบแบบหลวมกับตาราง== ( ตารางที่สอง) ซึ่งแสดงผลลัพธ์ของการเปรียบเทียบแต่ละค่าในคอลัมน์แรกกับค่าในคอลัมน์อื่น ๆ :

    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 == "php" หรือ "php" == 0 ทั้งคู่จะให้ผลเป็นจริง เกิดอะไรขึ้นกันแน่?
Robert

1
@ Robert: สตริงไม่ได้เริ่มต้นด้วยตัวเลขจะถูกแปลงเป็น0เมื่อหล่อสตริง: codepad.org/qi40SG3E (int)"php" == 0ดังนั้น
เฟลิกซ์ลิ่ง

@ Robert: ผมหมายถึง"เมื่อโยนไปจำนวน "
เฟลิกซ์คลิง

12

นี่ไม่ใช่ข้อผิดพลาด แต่เป็นพฤติกรรมปกติของ PHP มันเกิดขึ้นเพราะตัว==ดำเนินการใน PHP ไม่ตรวจสอบชนิด

'' == null == 0 == false

หากคุณต้องการตรวจสอบว่าค่ามีประเภทเดียวกันหรือไม่ให้ใช้===แทน การศึกษาในลึกแตกต่างนี้โปรดอ่านเอกสารอย่างเป็นทางการ


8

ถ้าคุณใช้==, PHP nullถือว่าเป็นสตริงว่างหรืออาร์เรย์เป็น ที่จะทำให้ความแตกต่างระหว่างnullและemptyอาจใช้หรือ=== is_nullดังนั้น:

if($a === NULL) หรือ if(is_null($a))


if ($ a === NULL)
Caster


-1

การใช้งานempty- http://php.net/manual/en/function.empty.php

ตัวอย่าง:

$a = '';
if(empty($a)) {
    echo 'is empty';
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.