Разработчикам 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
,""
,''
,[]
).
Для лучшего восприятия того, как работают эти две конструкции, приведем примеры в нижеследующей таблице:
$value | isset($value) | empty($value) |
---|---|---|
[] | true | true |
[1, 5, 8] | true | false |
0 | true | true |
2 | true | false |
'0' | true | true |
'2' | true | false |
0.0 | true | true |
0.5 | true | false |
true | true | false |
'true' | true | false |
false | true | true |
'false' | true | false |
'' | true | true |
'someString' | true | false |
null | false | true |
unset($value) | false | true |