empty()
Функция empty() в PHP проверяет, является ли переменная пустой: не существует или имеет ложное значение.
Введение
empty() — это встроенная языковая конструкция PHP, которая позволяет определить, является ли переменная «пустой», то есть не содержит ли она значимого значения. Чаще всего она используется для защиты от отсутствующих полей формы, отсутствующих ключей массива и неинициализированных переменных перед тем, как ваш код попытается их использовать.
Главное, что нужно понять: empty($var) — это фактически сокращение для !isset($var) || $var == false. Иными словами, переменная является пустой, если она либо не существует, либо её значение является одним из «ложных» значений PHP. На этой странице объясняется, какие именно значения считаются пустыми, какие ловушки встречаются на практике и когда использовать empty() вместо isset() или is_null().
Синтаксис
bool empty(mixed $var)empty() принимает один аргумент, $var, и возвращает boolean: true, если переменная считается пустой, и false в противном случае. Поскольку это языковая конструкция, а не обычная функция, её можно безопасно вызывать на переменных, которые могут не существовать, без генерации предупреждения.
Примечание: До PHP 5.5 функция
empty()принимала только переменную. Современный PHP также допускает выражения, напримерempty(trim($name)).
Какие значения считаются «пустыми»?
Переменная является пустой, если она не существует, или если её значение является одним из следующих:
| Значение | empty() возвращает |
|---|---|
"" (пустая строка) | true |
"0" (строка-ноль) | true |
0 (целое ноль) | true |
0.0 (ноль с плавающей точкой) | true |
null | true |
false | true |
[] (пустой array) | true |
| неопределённая переменная | true |
любая непустая строка (например, "hello") | false |
| любое ненулевое число | false |
| непустой array | false |
Это именно тот набор значений, который PHP трактует как false в булевом контексте, плюс случай, когда переменная не установлена.
Пример использования
empty() при выводе через echo не печатает ничего для false/0 и 1 для true, поэтому в примере результат приводится к целочисленной метке для наглядности.
Здесь определяются шесть переменных разных типов: $var1 — пустая строка, $var2 — непустая строка, $var3 — null, $var4 — 0, $var5 — string "0", а $var6 — пустой array. empty() возвращает true для каждой из них, кроме $var2. Обратите внимание, что echo выводит 1 для true и пустую строку для false; в комментариях мы указываем 0 или 1, чтобы результат был понятнее.
Распространённые ловушки
"0" считается пустым значением
Это самый частый сюрприз. String "0" считается пустой согласно empty(), хотя она явно содержит символ. Это важно при обработке данных форм: пользователь, который вводит 0 в поле количества или возраста, получит отказ, если вы проверяете значение через empty().
<?php
$age = "0"; // a perfectly valid age from a form
var_dump(empty($age)); // bool(true) -- oops, treated as missing
var_dump($age === ""); // bool(false) -- the field was NOT blank
?>Если вы хотите отклонять только пустые поля, сравнивайте со строкой "" или используйте isset() вместе с проверкой длины, вместо empty().
empty() не предупреждает об неопределённых переменных или ключах
В отличие от прямого обращения к переменной, empty() безопасно вызывать на чём-то, что может не существовать. Она возвращает true и не генерирует никаких предупреждений.
<?php
$config = ["timeout" => 30];
var_dump(empty($config["timeout"])); // bool(false) -- key exists, value is 30
var_dump(empty($config["retries"])); // bool(true) -- key missing, no warning
var_dump(empty($undeclared)); // bool(true) -- no "undefined variable" notice
?>Это делает empty() идеальным инструментом для проверки необязательных ключей массива, например значений $_POST или $_GET, без предварительного вызова isset().
empty() vs isset() vs is_null()
Эти три конструкции легко перепутать. Разница заключается в том, какие состояния они считают «отсутствием значения»:
| Состояние переменной | empty() | isset() | is_null() |
|---|---|---|---|
| не объявлена | true | false | предупреждение + true |
null | true | false | true |
"", 0, "0", [] | true | true | false |
"hello", 42 | false | true | false |
Коротко:
- Используйте
isset(), когда вас интересует только то, существует ли переменная и не является ли онаnull. - Используйте
empty(), когда хотите узнать, есть ли какое-либо пригодное значение (не разграничивая0/""/отсутствие). - Используйте
is_null(), когда нужно явно обнаружитьnull.
Типичная реальная проверка необязательного поля формы выглядит так:
<?php
$_POST = ["username" => " "]; // simulate a submitted form with a blank-ish field
if (empty(trim($_POST["username"] ?? ""))) {
echo "Username is required";
} else {
echo "Welcome, " . trim($_POST["username"]);
}
?>Вывод:
Username is requiredЗдесь ?? "" задаёт значение по умолчанию, если ключ отсутствует, trim() убирает пробелы из введённого значения, а empty() затем обрабатывает как случай отсутствия ключа, так и случай пустой строки.
Заключение
empty() — удобный инструмент для проверки, содержит ли переменная значимое значение, и её безопасно использовать на переменных и ключах массива, которые могут не существовать. Основная ловушка состоит в том, что "0", 0 и пустые строки — всё считается пустым, поэтому empty() не подходит, когда ноль является допустимым значением — в таких случаях используйте isset() или явное сравнение. Чтобы точно узнать содержимое переменной при отладке, комбинируйте empty() с var_dump() или gettype().