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" у будь-яких формах вважається "порожнім", ви можете потрапити в погані пастки, що коштують багато часу налагодження. Я б сказав: уникай будь-якої ціни і просто запиши логіку сам
Іван

Відповіді:


143

Це залежить від того, що ви шукаєте, якщо ви просто дивитесь, щоб побачити, чи він порожній, просто використовуйте, emptyяк він перевіряє, чи встановлено він також, якщо ви хочете знати, чи щось встановлено чи не використовується isset.

Empty перевіряє, чи встановлена ​​змінна, і якщо вона є, вона перевіряє її на null, "", 0 тощо

Isset просто перевіряє, чи встановлено це, може бути нічого недійсного

З empty, такі речі вважаються порожніми:

  • "" (порожній рядок)
  • 0 (0 як ціле число)
  • 0,0 (0 як поплавок)
  • "0" (0 як рядок)
  • НУЛЬ
  • ПОМИЛКОВИЙ
  • array () (порожній масив)
  • var $ var; (змінна оголошена, але без значення в класі)

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


Як зазначено в коментарях, відсутність попередження також важлива при порожньому ()

PHP керівництво говорить

empty () - протилежний (boolean) var, за винятком того, що попередження не створюється, коли змінна не встановлена .

Що стосується набору

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 
 {...}

Це означає - у коді вище я перевіряю, чи встановлена ​​змінна чи не двічі? :)
Дмитро Белавенцев

Просто перевірте, чи він порожній, php не видасть помилку, якщо це не так.
Pez Cuckow

3
Ви пропускаєте найбільшу точку empty: Це не видає попередження, коли перевірена змінна не існує. У цьому вся суть цієї функції, інакше вона ідентична == false.
деге

1
Отже, факт в посібнику про те, що "не створюється попередження, коли змінна не встановлена" мене бентежило. Жодне попередження не означає, що у мене не буде проблем у наведеному нижче коді. Тепер мені це зрозуміло. Дуже багато!
Дмитро Белавенцев,

"isset просто перевіряє, чи встановлено це, воно все одно може бути нульовим" Це неправда: issetза нульовою (і існуючою) змінною буде оцінено false.
netcoder

12

У вашому конкретному випадку: if ($var).

Вам потрібно скористатися, issetякщо ви не знаєте, чи існує змінна чи ні. Оскільки ви оголосили це на першому рядку, ви знаєте, що він існує, отже, вам не потрібно, ні, не слід використовувати isset.

Те саме стосується empty, лише те, що emptyтакож поєднує перевірку на правдивість цінності. emptyеквівалентно !isset($var) || !$varі !emptyеквівалентна isset($var) && $varабо isset($var) && $var == true.

Якщо ви хочете лише перевірити змінну, яка повинна існувати для правдивості , 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. В іншому випадку здається, що порожнім () просто чудово користуватися окремо.


Пояснення щодо голосування проти? Він не запитує, чи вони однакові, він запитує, чи потрібно перевірити його, перш ніж перевірити порожнє.
chris

Я не downvote, але «використання Исеть , якщо ви хочете знати , що це не є нульовий» не є правильним: $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) } 

Ви помітите, що всі результати "набору" протилежні "порожнім" результатам, крім випадків $b=false. Усі значення (крім null, які не є значеннями, а не значеннями), які оцінюються як false, повертаються true, коли перевіряються на, issetа false - при тестуванні "порожнім".

Тому використовуйте, isset()коли вас турбує існування змінної. І використовуйте, emptyколи ви перевіряєте на істинні чи неправдиві. Якщо фактичний тип питань порожнечі, використання is_nullі ===0, ===false, ===''.


1

Порожня повертає істину, якщо var не встановлено. Але isset повертає true, навіть якщо 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 Просто приблизний приклад :) Добре використання = 0 не <0
Akos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.