Php проверка переменной на пустоту. Шпаргалка для PHP: FALSE, NULL и значения, с ними связанные. Функция is_null() и языковые конструкции isset() и empty()

Если при работе со строками у вас возникла необходимость проверить пустая ли строка, начинающие прогера используют как правило функцию strlen() . Эта функция достаточно быстра, потому что не производит никаких вычислений, а просто возвращает уже известное значение длины строки, доступное в zval (в PHP для хранения переменных используется структура C). Но все-таки, т.к. strlen() - это функция, она немного медленная, потому что требует при вызове нескольких действий, таких как перевод в нижний регистр и поиск в таблице хэша. В некоторых случаях вы можете увеличить скорость выполнения вашего кода при помощи использования empty() ..., но и empty() еще можно немного оптимизировать.

Возмем пример например проверка пути картинок , функция проверяет если путь пустой то заменяем на другой путь к примеру "images/noimage.jpg".

И так задача вся сводится в проверке пустая ли переменая типа строка. Попробуем 4 способа:

  • if(strlen($img_path)>0)
  • if($img_path{0})
  • if(empty($img_path))
  • и еще один способ на последок.

И так напишем первым способом:

Function check_image_path($img_path ) { if (strlen ($img_path ) >0 ) { $img_path = "images/noimage.jpg" ; } return $img_path ; }

проведем тестирование, среднее время теста заняло 1.43795800209 сек.

Еще немного подумав... Можно обращаться сразу к первому символу строки, а не ко всей строке. Если первый символ есть значит строка не пустая. Первый символ в строке нумируется с "0".

Function check_image_path($img_path ) { if ($img_path { 0 } ) { $img_path = "images/noimage.jpg" ; } return $img_path ; }

среднее время теста заняло 1.19431300163 сек., 17% времени отыграли

Попробуем написать через empty() теперь:

Function check_image_path($img_path ) { if (empty ($img_path ) ) { $img_path = "images/noimage.jpg" ; } return $img_path ; }

среднее время теста заняло 1.1341319084 сек., 5% времени отыграли от предедущего примера

Теперь посмотрим на предпоследний и последний пример над нами. Посмотрим как это можно объединить. подумайте... как оптимизировать можно еще?

Function check_image_path($img_path ) { if (empty ($img_path { 0 } ) ) { $img_path = "images/noimage.jpg" ; } return $img_path ; }

среднее время теста заняло 1.07465314865 сек., и опять 5% времени выйграли...

Как же это работает и почему быстрей. А вот $img_path{0} возращяет первый символ... и затем функция empty() проверяет пустую строку... разница от предедущего примера в том что функции передается только один символ, а не вся строка. Таким образом от первого примера до последнего мы выйграли 25% времени.

В PHP значения FALSE и NULL и связанные с ними значения отличаются от того, как это обычно в других языках и имеют свои неочевидные особенности.
В статье рассмотрены эти особенности.
Для новичков это может быть полезно для видимости полной картины, для опытных читателей - обновить в памяти, если какой-то ньюанс вылетел из головы.

FALSE в If -выражениях

В соответствии с документацией PHP следующие значения равны FALSE после приведения в тип boolean:
  • само булевское значение FALSE
  • пустая строка (string) ("") и строка "0" .
  • пустой массив (array) – array().
  • an object with zero member variables (только в PHP 4, в статье не рассматривается)
  • специальное значение NULL (включая неустановленные переменные)
  • SimpleXML objects (в данной статье не рассматривается)
Это значит, что если такие значения, передаются в условие:
if (…) echo “1”; else echo “0”;
то будет выведена строка "0" .

Если значение переменной не установлено (unset), то еще и может выдаваться предупреждение. Напомним, предупреждение в условии можно убрать, написав перед переменной @ .

Например:

If (@$undefVar) { …}
Но использовать @ стоит только в крайних случаях, когда вы хорошо подумали и других подходящих вариантов нет. См. функцию isset() .

Функция is_null() и языковые конструкции isset() и empty()

is_null() возвращает TRUE только для переменных, которым не присвоено никакого значения или которым присвоено значение NULL .
isset() возвращает один в один противоположные булевые значения в сравнении с is_null() .
Если переменной не присвоено значение, то is_null() также выдает предупреждение «Undefined variable» , в отличии от isset() , которая не выдает никаких предупреждение.
Напомним, для того, чтобы убрать значение переменной, можно использовать функцию unset() . Также с этой целью можно присвоить значение NULL , чтобы избежать предупреждений компилятора при попытке чтения значения переменной.

Обратите внимание, что в отличии от переменных для работы с константами необходимо использовать конструкцию defined() .

Строковое представление

Расмотрим строковое представление ложных констант.
Например при конкатенации значения преобразуются в следующие строки, приведенные в таблице ниже:

Более подробно тема преобразования в строки описана на официальном сайте в параграфе Converting to string .

Операторы сравнения

Перейдем к операторам сравнения .
Все ложные значения, как и ожидалось, возвращают истину при сравнении со значением FALSE при помощи оператора " == ".
Но не следует здесь расчитывать на транзитивность при сравнении ложных строковых констант между собой.
Приведем полную таблицу сравнения ложных значение (плюсом обозначены элементы таблицы, которые при сравнении с помощью оператора " != " возвращают истинное значение:

$undef –переменная, которой не присваивалось значение

Из таблицы можно сделать некоторые приятные выводы:
1. Если мы знаем, что у нас используются только строки, то мы их можем спокойно сравнивать и не беспокоиться, что "" (пустая строка) будет равна "0" .
2. Массивы никогда не равны строкам, целым и действительным числам.

Поскольку тип различных ложных констант разный, то для того, чтобы их отличать можно использовать пару операторов === и!== .
Оператор === возвращает ложное значение для всех пар ложных значений.
Истинное значение возвращает лишь для аргументов, одному из которых присвоено значение NULL, а второму не присвоено никакого значения.

Отличие переменных с NULL значением и неопределенных переменных

Оператор === позволяет различать все ложные значения, кроме как переменных с NULL-значением от переменных, которым значение не присваивалось.

Такие переменные можно отличить с помощью функции get_defined_vars() .

Если нужно определить, было ли присвоено значение переменной $var , то для этого может быть использован следующий фрагмент код:
if (array_key_exists("var", get_defined_vars())) { echo "var is defined"; // $var is assigned NULL } else { echo "var is NOT defined"; // $var is not defined or unset($var) was called }

Выводы

Всегда нужно помнить, что в PHP два ложных значения могут быть не равны между собой, а переменные, которые, на первый взгляд, разные, могут оказаться одинаковыми при сравнении. Чтобы избежать таких сюрпризов, можно воспользоваться операторами === и!== .

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

Тестирование проводилось на PHP 5.3.1.

Дополнительные ссылки

1. PHP type comparison tables .
2. MySQl Null and Empty Strings in context of PHP .

Теги: Добавить метки

Современное программирование давно и успешно манипулирует нетипированными переменными. Тип переменной можно не указывать заранее и менять его в процессе выполнения программы.

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

О пустом и не существующем

Функция PHP empty() обратна функции isset() и имеет некоторые особенности использования. Если переменной нет, то первая функция отзывается об этом положительно и ее результат - true, а вторая - отрицательно, то есть ее значением будет false.

По определению isset() призвана проверять существование переменной. Не имеет значения, что и как было присвоено переменной, главное, что она есть и не уничтожена функцией unset(). Результат функции isset() будет положительными - true. Важно помнить, что если $iVar = 0; то isset($iVar) будет true, но и empty($iVar) будет тоже true.

В первом случае результат означает, что переменная существует, во втором случае - переменная пустая, то есть значение "0" в любом его виде, будь то строка ("0") или число (дробное - 0.0 или целое - 0) все равно: empty($iVar) будет равно true.

О безопасности и контроле

Практика показывает, что нетипированные языки дают значительно больше свободы программисту, но предполагают, что его отношение к работе над алгоритмом более ответственно.

PHP предлагает современный синтаксис, поддерживающий устоявшуюся семантику, имеет мало ошибок, но требует к себе внимательного отношения. Например, вызов любой функции предполагает какое-то количество параметров.

Вызывая функцию, вовсе не обязательно передавать все параметры, можно передать лишь существенную их часть. Функция "обязана" проверить наличие и существование всех параметров. Те из них, которые отсутствуют или имеют неверные значения, необходимо привести к нормальному виду, присвоить им нужные значения.

В этом контексте функция PHP empty() имеет существенное значение. Выражение:

$a = "1;2" + 20

присвоит переменной $a значение 21, поскольку первая часть выражения будет представлена как 1, а вторая так и будет 20.

Результат будет иметь тип число и функция PHP empty($a) будет иметь результат - false, то есть переменная $a не пустая.

В этом контексте, имея функцию:

funcTest($a = 0, $b = 20)

При вызове:

$res = funcTest($aVal, $bVal)

будет иметь желаемое, то есть результат функции. А при вызове:

  • $res = funcTest($aVal. $bVal)

в тело функции попадает только один параметр со значением "$aVal . $bVal" и скорее всего этот параметр будет интерпретирован как строка символов.

PHP empty() для объектов и массивов

Синтаксис языка имеет достаточное количество конструкций и функций для работы с объектами и массивами, однако с точки зрения проверки их на существование и на наличие значения особых отличий от переменных нет.

PHP empty (array) - эквивалентно вызову empty (simple variable). Однако в отношении объектов есть весьма существенные соображения. Что касается проверки объекта на существование (isset), вопрос вряд ли имеет смысл. Что касается функции PHP empty(), то целесообразность ее использования остается под вопросом.

По логике объектно-ориентированного программирования, объект имеет собственное содержание и собственный набор методов. Сказать пустой он или не пустой может только сам объект, но не сторонняя функция, пусть даже входящая в синтаксис языка.

Объект и его функция empty()

На этом простом, но законном, основании следует рассматривать всякий объект в контексте его понимания "пустоты". Например, реализация объекта "Штатное расписание" состоит из записей "Сотрудник". Но если нет ни одного сотрудника, то в "Штатном расписании" всегда есть варианты должностей вероятных сотрудников.

На каком уровне применить здесь функцию PHP empty object? На уровне "Штатное расписание" все существует, даже если нет ни одного сотрудника. На уровне "Сотрудник" объект уже есть, даже если он заполнен не полностью. А не полностью заполненный объект можно отнести к пустому объекту. Пользы от него штатному расписанию никакой.

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

строку переменной (12)

У меня есть функция isNotEmpty, которая возвращает true, если строка не пустая и false, если строка пуста. Я узнал, что он не работает, если я пропускаю через него пустую строку.

Function isNotEmpty($input) { $strTemp = $input; $strTemp = trim($strTemp); if(strTemp != "") //Also tried this "if(strlen($strTemp) > 0)" { return true; } return false; }

Выполняется проверка строки с помощью isNotEmpty:

If(isNotEmpty($userinput["phoneNumber"])) { //validate the phone number } else { echo "Phone number not entered
"; }

Если строка пуста, else не выполняется, я не понимаю, почему, может кто-то пролить свет на это, пожалуйста.

Answers

если у вас есть поле, а именно serial_number, и вы хотите проверить пустое место

$serial_number = trim($_POST); $q="select * from product where user_id="$_SESSION""; $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs)){ if(empty($_POST["irons"])){ $irons=$row["product1"]; }

таким образом, вы можете перебирать все петли в цикле с другой пустой функцией

Ну, вместо ответа (я считаю, что вы уже исправили свою проблему), я дам вам совет.

Я не знаю обо всех остальных, но лично меня очень раздражает при виде чего-то вроде:

If(<>) { return true; } return false;

это требует элегантного « return (<>); ». Пожалуйста, всегда смотрите на свой код и удаляйте эту логику. Для каждой ситуации вам не нужен оператор IF.

Я просто пишу свою собственную функцию is_string для проверки типов и strlen для проверки длины.

Function emptyStr($str) { return is_string($str) && strlen($str) === 0; } print emptyStr("") ? "empty" : "not empty"; // empty

EDIT: вы также можете использовать функцию trim чтобы проверить, не содержит ли строка.

Is_string($str) && strlen(trim($str)) === 0;

PHP имеет встроенную функцию, называемую empty() Тест выполняется путем ввода if(empty($string)){...} Ссылка php.net: php empty

У вас есть ответ, но в вашем случае вы можете использовать

Return empty($input);

Return is_string($input);

Простая проблема. Изменить:

If(strTemp != "")

If($strTemp != "")

Возможно, вы также можете изменить его на:

If($strTemp !== "")

так как!= "" вернет true, если вы передадите числовое число 0 и несколько других случаев из-за автоматического преобразования типа PHP .

Также имейте в виду, что PHP уже имеет функцию empty() .

PHP оценивает пустую строку на false, поэтому вы можете просто использовать:

If (trim($userinput["phoneNumber"])) { // validate the phone number } else { echo "Phone number not entered
"; }

Я всегда использую регулярное выражение для проверки пустой строки, относящейся ко дням CGI / Perl, а также к Javascript, поэтому почему бы и не PHP, например (хотя и непроверенный)

Return preg_match("/\S/", $input);

Где \ S представляет любой символ без пробелов

Просто используйте функцию strlen ()

If (strlen($s)) { // not empty }

Я недавно задал себе тот же вопрос.
Существует несколько возможных решений, здесь 3 действительных:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (добавлен после просмотра answer Марка Байера)
  • используя цикл:

    Function startsWith(s,starter) { for (var i = 0,cur_c; i < starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

Я не сталкивался с последним решением, которое использует использование цикла.
Удивительно, но это решение значительно превосходит первые 3.
Вот тест jsperf, который я выполнил, чтобы прийти к такому выводу: http://jsperf.com/startswith2/2

ps: ecmascript 6 (гармония) вводит собственный метод startsWith для строк.
Подумайте, сколько времени было бы спасено, если бы они подумали о включении этого очень необходимого метода в первую версию.

Обновить

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

Function startsWith2(str, prefix) { if (str.length < prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i < 0; }

В PHP значения FALSE и NULL и связанные с ними значения отличаются от того, как это обычно в других языках и имеют свои неочевидные особенности.
В статье рассмотрены эти особенности.
Для новичков это может быть полезно для видимости полной картины, для опытных читателей - обновить в памяти, если какой-то ньюанс вылетел из головы.

FALSE в If -выражениях

В соответствии с документацией PHP следующие значения равны FALSE после приведения в тип boolean:
  • само булевское значение FALSE
  • пустая строка (string) ("") и строка "0" .
  • пустой массив (array) – array().
  • an object with zero member variables (только в PHP 4, в статье не рассматривается)
  • специальное значение NULL (включая неустановленные переменные)
  • SimpleXML objects (в данной статье не рассматривается)
Это значит, что если такие значения, передаются в условие:
if (…) echo “1”; else echo “0”;
то будет выведена строка "0" .

Если значение переменной не установлено (unset), то еще и может выдаваться предупреждение. Напомним, предупреждение в условии можно убрать, написав перед переменной @ .

Например:

If (@$undefVar) { …}
Но использовать @ стоит только в крайних случаях, когда вы хорошо подумали и других подходящих вариантов нет. См. функцию isset() .

Функция is_null() и языковые конструкции isset() и empty()

is_null() возвращает TRUE только для переменных, которым не присвоено никакого значения или которым присвоено значение NULL .
isset() возвращает один в один противоположные булевые значения в сравнении с is_null() .
Если переменной не присвоено значение, то is_null() также выдает предупреждение «Undefined variable» , в отличии от isset() , которая не выдает никаких предупреждение.
Напомним, для того, чтобы убрать значение переменной, можно использовать функцию unset() . Также с этой целью можно присвоить значение NULL , чтобы избежать предупреждений компилятора при попытке чтения значения переменной.

Обратите внимание, что в отличии от переменных для работы с константами необходимо использовать конструкцию defined() .

Строковое представление

Расмотрим строковое представление ложных констант.
Например при конкатенации значения преобразуются в следующие строки, приведенные в таблице ниже:

Более подробно тема преобразования в строки описана на официальном сайте в параграфе Converting to string .

Операторы сравнения

Перейдем к операторам сравнения .
Все ложные значения, как и ожидалось, возвращают истину при сравнении со значением FALSE при помощи оператора " == ".
Но не следует здесь расчитывать на транзитивность при сравнении ложных строковых констант между собой.
Приведем полную таблицу сравнения ложных значение (плюсом обозначены элементы таблицы, которые при сравнении с помощью оператора " != " возвращают истинное значение:

$undef –переменная, которой не присваивалось значение

Из таблицы можно сделать некоторые приятные выводы:
1. Если мы знаем, что у нас используются только строки, то мы их можем спокойно сравнивать и не беспокоиться, что "" (пустая строка) будет равна "0" .
2. Массивы никогда не равны строкам, целым и действительным числам.

Поскольку тип различных ложных констант разный, то для того, чтобы их отличать можно использовать пару операторов === и!== .
Оператор === возвращает ложное значение для всех пар ложных значений.
Истинное значение возвращает лишь для аргументов, одному из которых присвоено значение NULL, а второму не присвоено никакого значения.

Отличие переменных с NULL значением и неопределенных переменных

Оператор === позволяет различать все ложные значения, кроме как переменных с NULL-значением от переменных, которым значение не присваивалось.

Такие переменные можно отличить с помощью функции get_defined_vars() .

Если нужно определить, было ли присвоено значение переменной $var , то для этого может быть использован следующий фрагмент код:
if (array_key_exists("var", get_defined_vars())) { echo "var is defined"; // $var is assigned NULL } else { echo "var is NOT defined"; // $var is not defined or unset($var) was called }

Выводы

Всегда нужно помнить, что в PHP два ложных значения могут быть не равны между собой, а переменные, которые, на первый взгляд, разные, могут оказаться одинаковыми при сравнении. Чтобы избежать таких сюрпризов, можно воспользоваться операторами === и!== .

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