Как проверить пустая ли переменная php
Перейти к содержимому

Как проверить пустая ли переменная php

  • автор:

Как проверить пустая ли переменная php

Если переменная объявлена, но ей изначально не присвоено никакого значения (иначе говоря она не инициализирована), или если переменная вовсе неопределена, то нам будет проблематично ее использовать. Например:

При попытке вывести значение переменной мы получим диагностическое сообщение о том, что переменная не определена:

Warning: Undefined variable $a in C:\localhost\hello.php on line 10

Ситуация может показатся искуственной. Тем не менее нередко переменные в PHP получают некоторые данные извне, например, ввод пользователя. Соответственно возникает необходимость перед использованием данных проверить, что эти данные определены, что они имеются.

Для проверки существования переменной PHP предоставляет ряд встроенных функций.

Оператор isset

Функция isset() позволяет определить, инициализирована ли переменная или нет. Если переменная определена, то isset() возвращает значение true . Если переменная не определена, то isset() возвращает false . Также если переменная имеет значение null функция isset() также возвращает false .

Здесь переменная $message не инициализирована, поэтому выражение isset($message) будет возвращать значение false .

переменная message не определена

Теперь пусть переменная $message имеет начальное значение:

$message = "Hello PHP"; if(isset($message)) echo $message; else echo "переменная message не определена";

В этом случае выражение isset($message) будет возвращать true , поэтому будет выполняться инструкция echo $message :

Hello PHP

Однако если переменной присвоено начальное значение null , то опять же будет считаться, что эта переменная не установлена:

$message = null; if(isset($message)) echo $message; else echo "переменная message не определена";
переменная message не определена

empty

Функция empty() проверяет переменную на «пустоту». «Пустая» переменная — это переменная, значение которой равно null , 0, false или пустой строке — в этом случае функция empty() возвращает true :

Здесь переменная $message хранит пустую строку, поэтому выражение empty($message) возвратит true .

переменная message не определена

При этом если строка содержит даже хотя бы один пробел и больше ничего ( $message = » » ), то такая строка уже не считается пустой.

unset

С помощью функции unset() мы можем уничтожить переменную:

Но, как правило, необходимость в подобном удалении переменной возникает редко, так как PHP автоматически удаляет переменные, когда завершается выполнение контекста (например, функции), в котором определены эти переменные.

empty

Проверяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или её значение равно FALSE . empty() не генерирует предупреждение если переменная не существует.

Список параметров

Замечание:

До PHP 5.5 empty() проверяет только переменные, и попытка проверить что-то еще вызовет ошибку синтаксиса. Другими словами, следующий код не будет работать: empty(trim($name)). Используйте вместо него trim($name) == false.

Если переменная не существует, предупреждение не генерируется. Это значит, что empty() фактически является точным эквивалентом конструкции !isset($var) || $var == false

Возвращаемые значения

Возвращает FALSE , если var существует, и содержит непустое и ненулевое значение. В противном случае возвращает TRUE .

  • «» (пустая строка)
  • 0 (целое число)
  • 0.0 (дробное число)
  • «0» (строка)
  • NULL
  • FALSE
  • array() (пустой массив)
  • $var; (переменная объявлена, но не имеет значения)

Список изменений

empty() теперь поддерживает выражения, а не только переменные.

Проверка нечислового индекса строки возвращает TRUE .

Примеры

Пример #1 Простое сравнение empty() и isset() .

// Принимает значение true, потому что $var пусто
if (empty( $var )) echo ‘$var или 0, или пусто, или вообще не определена’ ;
>

// Принимает значение true, потому что $var определена
if (isset( $var )) echo ‘$var определена, даже если она пустая’ ;
>
?>

Пример #2 empty() и строковые индексы

В PHP 5.4 был изменен способ обработки строковых индексов в empty() .

$expected_array_got_string = ‘somestring’ ;
var_dump (empty( $expected_array_got_string [ ‘some_key’ ]));
var_dump (empty( $expected_array_got_string [ 0 ]));
var_dump (empty( $expected_array_got_string [ ‘0’ ]));
var_dump (empty( $expected_array_got_string [ 0.5 ]));
var_dump (empty( $expected_array_got_string [ ‘0.5’ ]));
var_dump (empty( $expected_array_got_string [ ‘0 Mostel’ ]));
?>

Результат выполнения данного примера в PHP 5.3:

bool(false) bool(false) bool(false) bool(false) bool(false) bool(false)

Результат выполнения данного примера в PHP 5.4:

bool(true) bool(false) bool(false) bool(false) bool(true) bool(true)

Примечания

Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.

Замечание:

При использовании функции empty() на недоступных (необъявленных) свойствах объекта будет вызван встроенный метод объекта __isset(), если он определен.

Смотрите также

  • isset() — Определяет, была ли установлена переменная значением отличным от NULL
  • __isset()
  • unset() — Удаляет переменную
  • array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
  • count() — Подсчитывает количество элементов массива или что-то в объекте
  • strlen() — Возвращает длину строки
  • Таблица сравнения типов

Проверка на существование и пустоту в PHP

Часто возникают ситуации, когда нужно проверить существование или пустоту переменной. В PHP для этого есть функции isset() , empty() и array_key_exists() .

Проверка существования переменной

Функция isset() возвращает true , если переменная существует и её значение не null :

Если передать в isset несколько переменных, она вернёт true при существовании всех переменных:

'; echo isset($name, $age, $status) ? 'Василиса есть' : 'Василисы нет';

Результат в браузере:

Василиса есть Василисы нет

Операторы объединения с NULL

В PHP 7 появился оператор объединения с NULL (или NULL-коалесцентный оператор) ?? . Он позволяет получить значение переменной, если она задана и не равна NULL, а иначе — значение по-умолчанию:

В PHP 7.4 появился присваивающий оператор объединения с NULL ??= .Он позволяет удобно задать значение переменной, если эта переменная ещё не задана (либо равна NULL):

// Как было раньше $name = $name ?? 'Василий'; // Как стало в PHP 7.4 $name ??= 'Василий';

Проверка на пустоту

Напомню, переменная считается пустой (приводится к false), если она имеет одно из следующих значений:

  • 0 (целое или дробное)
  • » (пустая строка)
  • ‘0’ (строка с числом 0)
  • [] (пустой массив)
  • null

Функция empty() возвращает true , если переменная не существует или пустая:

Поведение isset() и empty() сначала может немного запутать: первая возвращает true при существовании переменной, вторая — при не существовании. К этому нужно просто привыкнуть.

На самом деле isset() и empty() , аналогично echo , являются синтаксическими конструкциями, а не функциями.

Функции isset() и empty() гасят ошибку обращения к несуществующей переменной. Это одна из причин, почему они не являются обычными функциями.

ceil($var); // Notice: Undefined variable: var isset($var); // Ошибки нет

Существование элемента массива

Как мы узнали чуть выше, isset() возвращает false , если переменная существует, но имеет значение null .

Бывают ситуации, когда нам необходимо точно знать, существует ли определённый элемент массива или нет, даже если его значение NULL.

Для этого в PHP существует функция array_key_exists() :

Как правильней проверить содержимое строки?

Тривиальная задача: если строка не пустая, вывести её через echo.

Первоначально переменная объявляется как $str = »;

Вопрос — как правильней проверять на пустоту? В смысле, чтобы PHP не совершал лишних движений.

if (strlen($str) > 0)

(уверен, есть множество других)

  • Вопрос задан более трёх лет назад
  • 8528 просмотров

Комментировать
Решения вопроса 1
Помог ответ? В благодарность отметь его решением
Что вы подразумеваете под «пустотой». Строка нулевой длинны, не установленная переменная, null, 0?
Ответ написан более трёх лет назад
Нравится 2 15 комментариев
вообще, что бы учесть все эти случаи надежнее проверять с помощью empty

Audiophile

Посторонним В. @Audiophile Автор вопроса
Первоначально переменная объявляется как $str = »;

ну если вы уверенны, что переменная объявлена так как вы написали, то можно проверить просто:
if ($str != »)

Audiophile

Посторонним В. @Audiophile Автор вопроса
rework: тоже хороший вариант. Чем он будет отличаться от if (strlen($str) > 0)?
Посторонним В.: тем, что не высчитывается длинна строки. Но это «экономия на спичках», на мой взгляд

Посторонним В.: есть теоретически небольшой шанс, что strlen будет быстрее, чем сравнение. Но это нужно проверять экспериментом.

rework: А есть уверенность, что оператор != не использует вызов strlen для осуществления сравнения?
Но по поводу спичек согласен

Audiophile

Посторонним В. @Audiophile Автор вопроса

rework: да, если судить по логике, вариант if ($str !== ») — наиболее логичный. Так как сработает и при необъявленной переменной, и вообще в любом случае отличном от простого объявления пустой строки. Спасибо.

FanatPHP

при необъявленной переменной $str !== » НЕ сработает.
при не объявленной переменной будет ошибка типа notice

Audiophile

Посторонним В. @Audiophile Автор вопроса

rework: мне это и нужно. Чтобы в случае отклонения от условия либо выводилась строка, либо (если ошибку допустил я в коде, т. е. не то имя переменной вписал например) выводилась ошибка скрипта.

Сложность strlen($str) — O(1). А вот !== » это уже доп. операция приведения типов переменных.

Так что я бы поставил на strlen($str) > 0 .

FanatPHP

Андрей Попов: сложность обеих операций одинаковая — нулевая. не надо тут выковыривать из носа теоретические изыскания о скорости микроскопических процессов, которых на обработку одного НТТР запроса уходит миллион

FanatPHP: действительно, лучше об архитектуре приложения задуматься, об оптимизации запросов, кэшировании, чем ерундой заниматься.

FanatPHP: я отвечал скорее rework «тем, что не высчитывается длинна строки.» Это не верно. Т.к. она НЕ высчитывается.

А про «не надо тут выковыривать из носа теоретические изыскания о скорости микроскопических процессов, которых на обработку одного НТТР запроса уходит миллион»

Как я вижу и понял, вопрос не практический а теоретический. На практике все, рано или поздно, приходят к шаблонизаторам, ORM, фрейморкам и прочим ускоряющим скорость разработки в ущерб производительности инструментам.

Ответы на вопрос 2
Web/Android developer

Вы же сами явно написали — «если строка не пустая«, может тогда стоит применить функцию именно для этого случая?
т.е. empty(); — из названия же ясно для чего предназначена эта функция

Ответ написан более трёх лет назад

Audiophile

Посторонним В. @Audiophile Автор вопроса
Логично. Но если мы например написали неверно имя, !empty всегда даст true.

Наоборот !empty вернёт false, для несуществующих переменных. Просто в php зачастую переменные не объявляются заранее и надёжнее проверять именно через !empty, что бы не получить notice ошибку.

FanatPHP

empty() НЕ для этого случая.
FanatPHP: можно аргументы?

FanatPHP

документация. я понимаю, что она невнятно написана, но в принципе, если читать внимательно, то логику уловить можно.

FanatPHP

так же, облегчает понимание функции empty понимание того, что РНР — слабо типизованный язык.

FanatPHP: «содержимое СТРОКИ» — если уклон делать именно на строку, то да, не самый лучший выбор, т.к. empty выдаст true для null и т.д.

FanatPHP

если на пустоту — то тоже не лучший выбор. потому что тогда возникает вопрос, почему не if($var) Короче, аффтар выше уже все написал

FanatPHP: ну тогда уже разница в том, что один вариант выдаст NOTICE , а другой нет

FanatPHP

верно. empty проверяет, пуста ли переменная И существует ли она. то есть, это короткая запись if (isset($var) && $var). в то время как проверка на пустоту — это просто if ($var)

FanatPHP

Чебуратор тега РНР

Вообще, в данной постановке задача не имеет смысла.
Если строка пустая, то нет проблемы и вывести её — ничего от этого не изменится и не поломается.

Но если говорить не о выводе, а о проверке на «пустоту» (в терминах РНР), то
if ($str)
или
if (trim($str))
если мы не хотим обрабатывать строку, состоящую из пробельных символов.

Однако следует помнить, что ноль в РНР входит в понятие пустоты. поэтому, если мы хотим проверить равна ли переменная пустой строке, то именно эту проверку и надо делать,
if ($str !== »)

Отдельно хочу отметить заботу о совершающем лишние движения РНР. Людей, которые проявляют эту заботу, на нормальных ресурсах молча банят. Жаль что тостер — не нормальный ресурс.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *