isset () และ empty () - จะใช้อะไร


105

คุณช่วยปรับปรุงรูปแบบการเขียนโค้ดของฉันได้ไหม :) ในบางงานฉันต้องตรวจสอบ - ตัวแปรว่างเปล่าหรือมีบางอย่าง ในการแก้ปัญหานี้ฉันมักจะทำสิ่งต่อไปนี้

ตรวจสอบ - ชุดตัวแปรนี้หรือไม่? หากตั้งไว้ - ฉันตรวจสอบ - ว่างหรือไม่?

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

และฉันมีคำถาม - ฉันควรใช้ isset () ก่อนว่าง () - จำเป็นหรือไม่? เทีย!


ว่างเปล่า isset ($ var) || $ var == false
zloctb

2
ในความคิดเห็นของฉันว่างเปล่า () เป็นการพัฒนา PHP ที่น่ากลัว เนื่องจากถือว่า "0" ในรูปแบบใด ๆ เป็น "ว่าง" คุณอาจตกอยู่ในกับดักที่ไม่ดีซึ่งต้องเสียเวลาในการแก้ไขข้อบกพร่องมากมาย ฉันจะบอกว่า: หลีกเลี่ยงค่าใช้จ่ายทั้งหมดและเขียนตรรกะด้วยตัวคุณเอง
John

คำตอบ:


145

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

Empty ตรวจสอบว่าตัวแปรถูกตั้งค่าไว้หรือไม่และตรวจสอบค่าว่าง "", 0 ฯลฯ หรือไม่

Isset เพียงตรวจสอบว่ามีการตั้งค่าไว้หรือไม่อาจเป็นอะไรก็ได้ที่ไม่ใช่โมฆะ

ด้วยemptyสิ่งต่อไปนี้ถือว่าว่างเปล่า:

  • "" (สตริงว่าง)
  • 0 (0 เป็นจำนวนเต็ม)
  • 0.0 (0 เป็นลูกลอย)
  • "0" (0 เป็นสตริง)
  • NULL
  • เท็จ
  • array () (อาร์เรย์ว่าง)
  • var $ var; (ตัวแปรที่ประกาศ แต่ไม่มีค่าในคลาส)

จากhttp://php.net/manual/en/function.empty.php


ตามที่ระบุไว้ในความคิดเห็นการขาดคำเตือนก็สำคัญเช่นกันโดยว่างเปล่า ()

คู่มือ PHPกล่าว

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

เกี่ยวกับ isset

คู่มือ PHPกล่าว

isset () จะส่งคืนค่า FALSE หากทดสอบตัวแปรที่ตั้งค่าเป็น NULL


รหัสของคุณจะใช้ได้เป็น:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

ตัวอย่างเช่น:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}

มันหมายความว่า - ในโค้ดด้านบนฉันตรวจสอบว่ามีการตั้งค่าตัวแปรหรือไม่สองครั้ง? :)
Dmitry Belaventsev

เพียงตรวจสอบว่าว่างเปล่า php จะไม่แสดงข้อผิดพลาดหากไม่ใช่กรณีนี้
Pez Cuckow

3
คุณกำลังละเว้นจุดที่ใหญ่ที่สุดของempty: จะไม่ส่งคำเตือนเมื่อไม่มีตัวแปรที่ทดสอบ == falseนั่นเป็นจุดรวมของฟังก์ชั่นนี้มิฉะนั้นมันเหมือนกันกับ
หลอกลวง

1
ดังนั้นความจริงในคู่มือที่ว่า "ไม่มีการสร้างคำเตือนเมื่อไม่ได้ตั้งค่าตัวแปร" ทำให้ฉันสับสน ไม่มีคำเตือนไม่ได้หมายความว่าฉันจะไม่มีปัญหาในโค้ดด้านล่าง ตอนนี้มันชัดเจนสำหรับฉัน ขอบคุณมาก!
Dmitry Belaventsev

"isset เพียงแค่การตรวจสอบก็คือถ้าตั้งก็อาจจะยังคงเป็นโมฆะ"ที่ไม่จริง: issetใน null (และที่มีอยู่) falseตัวแปรจะมีการประเมินเพื่อ
netcoder

12

ในกรณีเฉพาะของคุณ: if ($var).

คุณจำเป็นต้องใช้issetหากคุณไม่รู้ว่ามีตัวแปรอยู่หรือไม่ เนื่องจากคุณประกาศว่าในบรรทัดแรกมากแม้ว่าคุณจะรู้ว่ามันมีอยู่แล้วด้วยเหตุนี้คุณไม่จำเป็นต้องไปแต่ว่าไม่ควรissetใช้

เดียวกันจะไปสำหรับemptyเท่านั้นที่emptyนอกจากนี้ยังรวมการตรวจสอบที่truthinessของค่า emptyเทียบเท่ากับ!isset($var) || !$varและ!emptyเทียบเท่ากับหรือisset($var) && $varisset($var) && $var == true

ถ้าคุณเพียงต้องการที่จะทดสอบตัวแปรที่ควรมีอยู่สำหรับtruthiness , if ($var)เป็นอย่างดีเพียงพอและตรงประเด็น


อันนี้อธิบายได้ดีกว่ามาก ถ้าเราได้รับการเปรียบเทียบกับกรณีอื่น ๆ ทั้งหมดนี้!empty is equivalent to isset($var) && $varมันจะดีมาก ขอบคุณ @deceze
Vir

6

คุณสามารถใช้ empty () - ตามที่เห็นในเอกสารมันจะส่งคืนเป็นเท็จหากตัวแปรไม่มีค่า

ตัวอย่างในหน้าเดียวกัน:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

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


คำอธิบายสำหรับการโหวตลง? เขาไม่ได้ถามว่าเหมือนกันหรือเปล่าเขาถามว่าต้องเช็ค isset ไหมก่อนเช็คว่าง
chris

ฉันไม่ได้ downvote แต่ "ใช้ isset ถ้าคุณต้องการที่จะรู้ว่ามันไม่ได้เป็นโมฆะ" $var = null; isset( $var ) == trueไม่ถูกต้อง:
JJJ

จากคู่มือ PHP5 / 4: isset () - "ตรวจสอบว่าตัวแปรถูกตั้งค่าและไม่ใช่ NULL" us.php.net/manual/en/function.isset.php
chris

2

นี่คือผลลัพธ์ของisset()และempty()สำหรับ 4 ความเป็นไปได้: ไม่ได้ประกาศ, ว่างเปล่า, เท็จและจริง

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

คุณจะสังเกตเห็นว่าทุกคนที่ 'isset' ผลเป็นตรงข้ามของผล 'ว่างเปล่า' ยกเว้น$b=falseสำหรับกรณีที่ ค่าทั้งหมด (ยกเว้นค่าว่างซึ่งไม่ใช่ค่า แต่ไม่ใช่ค่า) ที่ประเมินเป็นเท็จจะส่งคืนจริงเมื่อทดสอบโดยissetและเป็นเท็จเมื่อทดสอบโดย "ว่าง"

ดังนั้นใช้isset()เมื่อคุณกังวลเกี่ยวกับการมีอยู่ของตัวแปร และใช้emptyเมื่อคุณกำลังทดสอบว่าจริงหรือเท็จ หากประเภทที่เกิดขึ้นจริงในเรื่องความว่างเปล่าใช้is_nullและ===0, ,===false===''


1

ค่าว่างจะส่งคืนจริงหากไม่ได้ตั้งค่า var แต่ isset จะคืนค่าจริงแม้ว่า var จะไม่ว่างเปล่า


-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

นี่คือตัวอย่างง่ายๆ หวังว่าจะช่วยได้

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


7
strlen ต่ำกว่าศูนย์? ฉันอยากเห็นสตริงนั้น
หลอกลวง

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