Детальное руководство по empty() в PHP с примерами
Функция empty() в PHP: всё, что нужно знать
Функция empty() проверяет, является ли переменная пустой. Пустыми считаются: null, false, пустая строка '', ноль 0, строка '0', пустой массив [], а также необъявленная переменная (без вывода предупреждения). Функция возвращает true для пустых значений и false - для непустых.
Самый надёжный и краткий способ проверки на пустоту - использование встроенной функции empty().
$var = 0;
if (empty($var)) {
echo "Переменная пуста";
} else {
echo "Переменная не пуста";
}
Переменная пуста
Функция не вызывает ошибки, если переменная не определена. Это удобно для проверки данных из форм, где поле может отсутствовать.
Цель использования:
- Быстрая проверка на заполненность поля ввода.
- Защита от ошибок при работе с неопределёнными переменными.
Как проверить, что переменная существует и не равна null, не используя empty?
Вариант: функция isset()
$var = 0;
if (isset($var)) {
echo "Переменная существует (не null)";
} else {
echo "Переменная не определена или равна null";
}
Переменная существует (не null)
Проблема: isset() считает 0, '', false существующими, хотя empty() считает их пустыми. Частая ошибка - путаница при проверке обязательных полей формы.
Решение: использовать empty(), если нужно отсекать нулевые и пустые значения, или комбинировать isset() с дополнительной проверкой на '' === $var и т.д.
Как проверить, что переменная равна null?
Вариант: функция is_null()
$var = null;
if (is_null($var)) {
echo "Переменная равна null";
} else {
echo "Переменная не равна null";
}
Переменная равна null
Проблема: is_null() не подходит для проверки на пустоту в общем смысле, так как не считает пустыми 0 или ''. Ошибка: полагаться только на is_null() для проверки полей формы.
Решение: комбинировать с empty() или использовать '' === $var для явного сравнения.
Как проверить, что строка пуста или содержит только пробелы?
Вариант: функция trim() и сравнение с пустой строкой
$str = " ";
if (empty(trim($str))) {
echo "Строка пуста или состоит из пробелов";
}
Строка пуста или состоит из пробелов
Проблема: empty() без trim() считает строку с пробелами непустой. Ошибка: не учитывают пробелы как "пустой" ввод.
Решение: перед empty() применить trim() или использовать своё условие.
Как проверить, что массив пуст?
Вариант: функция count() или оператор === []
$arr = [];
if (count($arr) === 0) {
echo "Массив пуст";
}
// или
if ($arr === []) {
echo "Массив пуст";
}
Массив пуст Массив пуст
Проблема: empty() тоже работает с массивами, но может дать неверный результат для объекта, реализующего Countable. Ошибка: использование empty() для объекта с count > 0, если объект не определён как пустой.
Решение: для массивов подходит empty(); для сложных объектов лучше использовать count() или пользовательские проверки.
Расширенные примеры использования empty() и альтернативы
Пример 1: Проверка объекта с реализацией __isset() и __get().
class User {
private $data = ['name' => ''];
public function __isset($key) {
return isset($this->data[$key]);
}
public function __get($key) {
return $this->data[$key] ?? null;
}
}
$user = new User();
var_dump(empty($user->name)); // bool(true) - потому что пустая строка
var_dump(empty($user->age)); // bool(true) - неопределённое свойство
bool(true) bool(true)
Пример 2: Использование empty() с функцией array_filter() для удаления пустых элементов.
$input = ['apple', '', 'banana', 0, false, null, 'cherry'];
$filtered = array_filter($input, function($value) {
return !empty($value);
});
print_r($filtered);
Array
(
[0] => apple
[2] => banana
[6] => cherry
)
Пример 3: Проверка вложенных массивов с помощью empty() и null coalescing.
$data = ['user' => ['name' => 'Alice', 'age' => 0]];
// Проверка, есть ли возраст (даже если 0)
if (!empty($data['user']['age'] ?? null)) {
echo "Возраст указан";
} else {
echo "Возраст пуст или не указан";
}
// Вывод: Возраст пуст или не указан (так как 0 считается пустым)
Возраст пуст или не указан
Пример 4: Использование empty() для проверки результата функции.
function getUser() {
return null; // или false, или массив
}
$user = getUser();
if (empty($user)) {
echo "Пользователь не найден или пустые данные";
} else {
echo "Пользователь найден";
}
Пользователь не найден или пустые данные
Пример 5: Проверка строки на число 0 с помощью empty() и строгого сравнения.
$value = '0';
if (empty($value)) {
echo "empty считает '0' пустым";
}
// Альтернатива с сохранением 0
if ($value === '0' || $value === 0) {
echo "Значение равно 0, но не пусто в контексте числа";
}
empty считает '0' пустым Значение равно 0, но не пусто в контексте числа
Пример 6: Проверка объекта, реализующего Countable, с помощью count() для более точного контроля.
class Items implements Countable {
private $items = [];
public function add($item) {
$this->items[] = $item;
}
public function count(): int {
return count($this->items);
}
}
$bag = new Items();
$bag->add('book');
echo count($bag); // 1
echo empty($bag) ? 'пуст' : 'не пуст'; // не пуст - объект не считается пустым, несмотря на count()?
// В PHP 8 объект без __isset не попадает под empty, поэтому вернёт false
1 не пуст