Отличия isset и empty в PHP и случаи их использования

Разработчикам PHP довольно часто приходится сталкиваться с необходимостью проверки на существование значений переменных, «пустоту» массивов и строк, наличие определенных ключей массива. В PHP есть языковые конструкции isset и empty, которые используются в подобных проверках. Однако незнание особенностей работы этих конструкций может привести к неверному их употреблению. В этой статье мы подробно опишем суть isset и empty, определим их отличия и рассмотрим, в каких ситуациях можно использовать каждую из этих конструкций.

Конструкция isset в PHP

Синтаксис:

isset(mixed $var, mixed ...$vars): bool

Языковая конструкция isset принимает в качестве параметров один или несколько значений и возвращает булевый результат.

Предназначение isset вытекает из ее названия — проверить, установлена ли переменная каким-либо значением. Переменная будет считаться установленной, если:

  • ей присвоено любое значение, кроме null;
  • она не была удалена с помощью языковой конструкции unset.

Результат выполнения isset с переменной, которая была определена, вернет true, в противном случае false.

При проверке нескольких переменных isset возвратит true только в том случае, если все переданные переменные установлены.

Для isset существует довольно компактный способ записи условия с помощью сокращенной формы тернарного оператора. Допустим, у нас есть переменная $someValue. Проверить, установлена ли она, можно таким способом:

// если переменная определена, то в $result скопируем ее значение, иначе в $result попадет строка 'Не определена'
$result = $someValue ?? 'Не определена';

// записанный выше вариант идентичен этому...
$result = isset($someValue) ? $someValue : 'Не определена';

// ...и этому
if (isset($someValue)) {
	$result = $someValue;
} else {
	$result = 'Не определена';
}

Если мы создаем переменную, не инициализируя ее — это явная ситуация, при которой переменная будет являться не установленной и результат isset будет false:

$someValue;
$result = isset($someValue); // false

Мы можем удалить инициализированную переменную с помощью unset. Тогда isset также вернет false:

$someValue = 'initialized';
unset($someValue);
$result = isset($someValue); // false

Стоит обратить внимание на один немаловажный момент, вводящих некоторых разработчиков в заблуждение. Результат isset будет true для следующий значений:

  • целого числа 0;
  • чисел с плавающей точкой, состоящих из нулей (0.0);
  • пустых строк ("", '').

isset и массивы

Конструкция isset довольно полезна при использовании с массивами. Например, вам необходимо выполнить некоторые действия со значением элемента массива, но элемента с искомым ключом может не быть. И тогда выполняемые действия с несуществующим элементом приведут к ошибке. Поэтому сперва нам нужно проверить, есть ли такой элемент.

Это можно сделать с помощью isset, которая вернет true, если такой элемент существует в массиве и не равен null:

$response = [
    'success' => false,
    'error' => 'An error occurred'
];

if (isset($response['error'])) {
    echo 'Result: ' . $response['error']; // Result: An error occurred
}

Еще один пример использования isset с массивами вы можете увидеть в этой статье.

isset и строки

Также с помощью isset можно проверить, существует ли символ в строке на определенной позиции:

$someString = 'offsetme';

var_dump(isset($someString[4])); // true
var_dump(isset($someString[8])); // false

Конструкция empty в PHP

Синтаксис:

empty(mixed $var): bool

С помощью языковой конструкции empty можно проверить переменные на «пустоту». На вход empty принимает переменную, возвращает true, если она пуста, и false, когда переменную нельзя назвать пустой.

Определим, что подпадает понятие «пустой переменной» для empty. Если переменная удовлетворяет следующим условиям, то empty вернет true:

  • не инициализирована;
  • содержит такие значения: false, null, целое число 0; строка '0'; число с плавающей точкой, состоящее из нулей (0.0); пустая строка ("", ''), пустой массив ([]).

Обратите внимание, что число 0, строка '0', а также false являются пустыми, в то время как строка 'false' будет восприниматься empty обычной строкой. Поэтому возвращаемый результат применительно к параметру со значением 'false' будет false.

Пример:

$demoValues = [0, 4, '0', '4', 0.0, '0.0', 0.4, '0.4', false, 'false', null, 'null', []];

foreach($demoValues as $key => $value) {
    var_dump(empty($value));
}

// Результат:
bool(true) // 0
bool(false) // 4
bool(true) // '0'
bool(false) // '4'
bool(true) // 0.0
bool(false) // '0.0'
bool(false) // 0.4
bool(false) // '0.4',
bool(true) // false
bool(false) // 'false'
bool(true) // null
bool(false) // 'null'
bool(true) // []

empty и массивы

На практике часто возникает ситуация, когда нужно узнать, содержит ли массив хотя бы один элемент. Это проверку можно легко осуществить, прибегнув к возможностям языковой конструкции empty. Передав ей интересующий массив в качестве параметра, мы получим true, если этот массив пуст.

Допустим, с помощью метода-репозитория мы получили результат запроса к базе данных в виде массива сущностей. Мы хотим определить, существуют ли вообще записи в базе по условию запроса. Это можно узнать, использовав empty:

// получим массив сущностей
$dbResult = $this->getSomeRepositoryResult();

// если массив непустой, искомые записи в базе есть
$entitiesExist = !empty($dbResult);

if ($entitiesExist) {
    // если записи существуют, выполняем этот код...
} else {
    // ...иначе этот
}

Отличия isset от empty

Резюмируя все вышеописанное, проведем сравнение возможностей языковых конструкций isset и empty и определим, когда лучше использовать каждую из них.

Использование isset подходит для случаев, чтобы узнать:

  • существует ли элемент массива с конкретным ключом;
  • инициализирована ли переменная;
  • содержит ли переменная значение, отличное от null.

Употребляйте empty, если хотите определить:

  • является ли массив пустым (не содержит ни одного элемента);
  • инициализирована ли переменная;
  • записано ли в переменной «пустое» значение (false, null, 0, '0', 0.0, "", '', []).

Для лучшего восприятия того, как работают эти две конструкции, приведем примеры в нижеследующей таблице:

$valueisset($value)empty($value)
[]truetrue
[1, 5, 8]truefalse
0truetrue
2truefalse
'0'truetrue
'2'truefalse
0.0truetrue
0.5truefalse
truetruefalse
'true'truefalse
falsetruetrue
'false'truefalse
''truetrue
'someString'truefalse
nullfalsetrue
unset($value)falsetrue
Text.ru - 100.00%
Оцените статью
DevReflex
Добавить комментарий