ทำไมต้องตรวจสอบทั้ง isset () และ! empty ()


269

มีความแตกต่างระหว่างและisset !emptyถ้าฉันทำแบบบูลตรวจสอบสองครั้งนี้จะถูกต้องด้วยวิธีนี้หรือซ้ำซ้อน? และมีวิธีที่สั้นกว่าในการทำสิ่งเดียวกันหรือไม่?

isset($vars[1]) AND !empty($vars[1])

3
มีแผนภูมิที่ดีในผลลัพธ์ของการใช้กับตัวแปรประเภทต่าง ๆ (พวกเขามีความแตกต่าง) ที่นี่: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

การเติมเต็มที่ชัดเจนอย่างชัดเจนคือ isset และ is_null แต่! empty จะครอบคลุมบางส่วนที่แตกต่างกัน ทุกอย่างขึ้นอยู่กับประเภทของข้อมูลที่คุณกำลังทดสอบ
Jeff Clayton

คำตอบ:


420

นี่คือการซ้ำซ้อนอย่างสมบูรณ์ emptyจะมากหรือน้อยกว่าสำหรับการจดชวเลข!isset($foo) || !$fooและจะคล้ายคลึงกับ!empty isset($foo) && $fooคือemptyจะเป็นสิ่งที่กลับจากการissetบวกการตรวจสอบเพิ่มเติมสำหรับtruthinessของค่า

หรือกล่าวอีกนัยหนึ่งemptyก็เหมือนกัน!$fooแต่จะไม่ส่งสัญญาณเตือนหากไม่มีตัวแปร นั่นคือประเด็นหลักของฟังก์ชั่นนี้: ทำการเปรียบเทียบบูลีนโดยไม่ต้องกังวลกับตัวแปรที่ตั้งไว้

คู่มือทำให้เป็นแบบนี้:

empty()อยู่ฝั่งตรงข้ามของ(boolean) var, ยกเว้นว่าไม่มีคำเตือนถูกสร้างขึ้นเมื่อตัวแปรไม่ได้ตั้งค่า

คุณสามารถใช้!empty($vars[1])ที่นี่


7
แต่ถ้าไม่มี$vars[1]เขาก็จะได้รับการแจ้งเตือน
karim79

6
ฉันไม่รู้ว่าฉันได้รับความคิดนั้นจากที่ไหน บวกหนึ่ง
karim79

8
@karim IMO emptyเป็นหนึ่งในฟังก์ชันที่เข้าใจผิดมากที่สุดใน PHP ตัวอย่างเล็ก ๆ เกี่ยวกับ "ไม่มีคำเตือนถูกสร้างขึ้น" นั้นมองข้ามได้ง่ายมาก ฉันต้องสแกนเอกสารด้วยตัวเองสองสามครั้งเพื่อตรวจดูการโพสต์ที่นี่
หลอกลวง

2
empty($vars[1])ไม่ก่อให้เกิดคำเตือนใด ๆ แม้$vars[1]จะไม่ได้ตั้งค่า แต่echo $vars[1]จะ echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;ฉันจะตรวจสอบความเป็นจริงโดยใช้
Amil Waduwawara

4
@Shahor หลายภาษาถือว่าเป็น0 falsePHP ไม่ใช่คนเดียว ยังไม่แน่ใจว่าคำร้องเรียนของคุณคืออะไร
หลอกลวง

33

isset() ทดสอบว่าตัวแปรถูกตั้งค่าไว้หรือไม่และไม่เป็นโมฆะ:

http://us.php.net/manual/en/function.isset.php

empty() สามารถคืนค่าจริงเมื่อตัวแปรถูกตั้งค่าเป็นค่าที่แน่นอน:

http://us.php.net/manual/en/function.empty.php

เพื่อสาธิตสิ่งนี้ลองใช้รหัสต่อไปนี้ด้วย $ the_var ที่ไม่ได้กำหนดตั้งค่าเป็น 0 และตั้งค่าเป็น 1

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>

12

คำตอบที่ยอมรับไม่ถูกต้อง

isset () ไม่เทียบเท่ากับ! empty ()

คุณจะสร้างข้อบกพร่องที่ค่อนข้างไม่พึงประสงค์และยากที่จะแก้ไขข้อบกพร่องหากคุณไปตามเส้นทางนี้ เช่นลองใช้รหัสนี้:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb


7
คำตอบที่ได้รับการยอมรับในทางที่ไม่แสดงให้เห็นว่าเทียบเท่ากับisset !empty
หลอกลวง

8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}

1
แต่คุณยังไม่ได้จัดการตัวแปรไม่ได้ตั้งค่าตัวพิมพ์เล็ก
Amil Waduwawara

3

ว่างเปล่าเพียงตรวจสอบคือตัวแปรอ้างอิง / อาร์เรย์มีค่าถ้าคุณตรวจสอบphp doc (ว่าง)คุณจะเห็นสิ่งนี้ถือว่าเป็น emtpy

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

ในขณะที่ isset ตรวจสอบว่าตัวแปร isset และไม่เป็นโมฆะซึ่งสามารถพบได้ในphp doc (isset)


2

มันไม่จำเป็น

ไม่มีการสร้างคำเตือนหากไม่มีตัวแปร นั่นหมายความว่า empty () คือความรัดกุมเทียบเท่ากับ! isset ($ var) || $ var == false

php.net


2
สิ่งนี้ไม่เคยมีความจำเป็นในรุ่น PHP ใด ๆ เนื่องจากว่างเปล่าตรวจสอบ (ไม่) ออก isset คุณกำลังสับสนข้อเท็จจริงที่ว่าตอนนี้ว่างเปล่ารองรับการแสดงออกกับคำถาม
alxgb

มันเป็นความจริงเพียงห้าปีต่อมา
Lennon

2

isset($vars[1]) AND !empty($vars[1])!empty($vars[1])เทียบเท่ากับ

ฉันเตรียมรหัสง่าย ๆ เพื่อแสดงให้ประจักษ์

แถวสุดท้ายเป็นตัวแปรที่ไม่ได้กำหนด

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

และรหัส

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

ตัวแปรที่ไม่ได้กำหนดจะต้องถูกประเมินนอกฟังก์ชั่นเพราะฟังก์ชั่นจะสร้างตัวแปรชั่วคราวในขอบเขตนั้น


0

"Empty": ใช้ได้กับตัวแปรเท่านั้น ว่างอาจหมายถึงสิ่งต่าง ๆ สำหรับตัวแปรชนิดต่าง ๆ (ตรวจสอบด้วยตนเอง: http://php.net/manual/en/function.empty.php )

"isset": ตรวจสอบว่าตัวแปรนั้นมีอยู่และตรวจสอบค่า NULL จริงหรือเท็จ สามารถยกเลิกได้โดยเรียก "unset" ตรวจสอบคู่มืออีกครั้ง

การใช้อย่างใดอย่างหนึ่งขึ้นอยู่กับประเภทตัวแปรที่คุณใช้

ฉันจะบอกว่ามันปลอดภัยกว่าที่จะตรวจสอบทั้งสองอย่างเพราะคุณกำลังตรวจสอบก่อนอื่นถ้าตัวแปรนั้นมีอยู่และถ้าไม่ใช่ NULL หรือเปล่าจริง ๆ


3
@ szahn "ปลอดภัยกว่าสำหรับตรวจสอบทั้งคู่", - ในฐานะโปรแกรมเมอร์สามารถตรวจสอบทุกสิ่งที่คุณต้องการเพื่อความปลอดภัย แต่ถ้ารหัสของคุณซ้ำซ้อนคุณสามารถซ้ำซ้อนในฐานะโปรแกรมเมอร์ได้
madlopt

0

หากเราใช้หน้าเดียวกันเพื่อเพิ่ม / แก้ไขผ่านปุ่มส่งเหมือนด้านล่าง

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

จากนั้นเราไม่ควรใช้

isset($_POST['edit_id'])

bcoz edit_idถูกตั้งค่าไว้ตลอดเวลาไม่ว่าจะเป็นหน้าเพิ่มหรือแก้ไข แต่เราควรใช้เงื่อนไขการตรวจสอบด้านล่าง

!empty($_POST['edit_id'])

โพสต์ก่อนหน้านี้ถูกส่ง bcoz ฉันกด Enter โดยไม่ได้ตั้งใจนี่คือคำตอบที่สมบูรณ์ของฉัน ... ทำไม downvote? :(
diEcho

0
  • จากเว็บไซต์ PHP หมายถึงempty()ฟังก์ชั่น:

ส่งคืนFALSEถ้าvarมีค่าที่ไม่ว่างเปล่าและไม่เป็นศูนย์

นั่นเป็นเรื่องดีที่จะรู้ กล่าวอีกอย่างคือทุกอย่างตั้งแต่NULLถึง0ถึง "จะกลับมาTRUEเมื่อใช้งานempty()ฟังก์ชั่น

  • นี่คือคำอธิบายว่าisset()ฟังก์ชันส่งคืนอย่างไร:

ส่งคืนTRUEถ้าvarมีอยู่ FALSEมิฉะนั้น.

กล่าวอีกนัยหนึ่งเฉพาะตัวแปรที่ไม่มีอยู่ (หรือตัวแปรที่มีNULLค่าอย่างเคร่งครัด) จะกลับมาFALSEที่isset()ฟังก์ชัน ตัวแปรทั้งหมดที่มีประเภทของค่าใด ๆ ไม่ว่าจะเป็น0สตริงข้อความว่างเปล่าและอื่น ๆ TRUEจะกลับมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.