В чем разница между нулем и пустым?

Я новичок в концепции пустого и нулевого. Хотя я пытался понять разницу между ними, я еще больше запутался. Я наткнулся на статью по адресу http://www.tutorialarena.com/blog/php-isset-vs-empty.php однако я до сих пор не вижу, когда вы будете использовать isset и empty при проверке форм. Видя, что я не понимаю разницы, я не хочу использовать неправильные функции, а также не могу использовать функции в других областях. Может ли кто-нибудь привести примеры, которые помогут мне понять? Я очень новичок в кодировании, поэтому был бы признателен, если бы кто-нибудь мог привести мне примеры из реального мира и в то же время сделать его достаточно простым для новичков.


person PeanutsMonkey    schedule 11.04.2011    source источник
comment
возможный дубликат stackoverflow.com/questions/669488/   -  person nathan gonzalez    schedule 11.04.2011
comment
возможный дубликат какая разница между NULL, пустым и пустым в php?   -  person Gordon    schedule 11.04.2011


Ответы (9)


Переменная имеет значение NULL, если она не имеет значения и указывает в никуда в памяти.

empty() — это более буквальное значение слова пусто, например. строка "" пуста, но не NULL.

Пустыми считаются следующие вещи:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • 0,0 (0 как число с плавающей запятой)
  • "0" (0 в виде строки)
  • НУЛЕВОЙ
  • ЛОЖНЫЙ
  • array() (пустой массив)
  • вар $вар; (объявлена ​​переменная, но без значения в классе)

Источник.


Пример

$a is NULL.

$a = '' пусто, но не NULL.


Обновлять

Если $a='' пусто, но не NULL, когда я использую функцию empty() и когда я использую функцию isset().

isset() вернет FALSE, если переменная указывает на NULL.

Используйте empty(), когда понимаете, что является пустым (посмотрите на список выше).

Кроме того, когда вы говорите, что это никуда не указывает в памяти, что именно это означает?

Это означает, что $str = '' будет храниться в памяти в виде строки длиной 0.

Если бы это было $str = NULL, оно не занимало бы никакой памяти.

person alex    schedule 11.04.2011
comment
Спасибо, Алекс. Теперь запутанная часть. Если $a='' пусто, но не NULL, когда я использую функцию empty() и когда я использую функцию isset(). Кроме того, когда вы говорите, что это никуда не указывает в памяти, что именно это означает? - person PeanutsMonkey; 11.04.2011
comment
Спасибо @Алекс. Это только еще больше меня смутило. Итак, позвольте мне привести вам пример, и, возможно, вы поможете мне прояснить мое замешательство. У меня есть форма, в которой я ожидаю, что пользователи предоставят свое имя пользователя и пароль. Теперь я хочу проверить, отправил ли пользователь форму, а также ввел ли пользователь имя пользователя и пароль. Теперь в этом примере, когда я должен рассмотреть возможность использования isset и когда я должен рассмотреть возможность использования empty и почему? - person PeanutsMonkey; 11.04.2011
comment
@PeanutsMonkey Я бы определенно использовал empty() в этой ситуации. Вы должны получать строки только из отправленной пользователем формы. Может быть целесообразно сначала trim() значение, иначе строка, состоящая из пробелов, не будет пустой. - person alex; 11.04.2011
comment
@Алекс. Спасибо. Хорошо, теперь, если расширить этот пример, чтобы я действительно понял, когда использовать isset и empty. Я понимаю, что каждое значение, за исключением следующего, будет равно true для функции empty(). Это $value='a'. Это будет означать, что пустое значение является ложным. Теперь, если есть какое-либо другое значение или нет значения, т.е. $a; $а=''; $а=0; $а='0'; $а=ноль; $а=ложь; тогда empty() будет равен true. Когда пусто ложно, например. $a='a';, то установлена ​​переменная. - person PeanutsMonkey; 11.04.2011
comment
@Alex продолжил - Зачем мне когда-либо использовать isset для проверки данных, когда empty() гораздо шире, потому что я понимаю, что empty() обслуживает $a='', что означает, что пользователь не вводил никаких данных, что означало бы что переменная была установлена ​​и она НЕ равна нулю? - person PeanutsMonkey; 11.04.2011
comment
@Alex - Потому что, насколько я понимаю, если бы я использовал empty(), его нужно было бы написать как таковой if(empty($_POST[submit])) { }, что означало бы, что если форма была отправлена ​​и имеет значение отправки. Если бы я хотел проверить, действительно ли пользователь ввел какие-либо данные, я бы сделал следующее: если (пусто ($_POST [отправить])) { если (пусто ($_POST [имя пользователя])) print $ имя пользователя; иначе распечатать Пожалуйста, введите имя пользователя; } } - person PeanutsMonkey; 11.04.2011
comment
@Alex - Когда вы говорите «память», вы имеете в виду память веб-сервера? - person PeanutsMonkey; 11.04.2011
comment
@PeanutsMonkey Да, память сервера (объем, выделенный вашему процессу PHP). - person alex; 11.04.2011
comment
@Alex - поправьте меня, если я ошибаюсь $a=1; if(!empty($a)) { print Это не пустое значение; } — это правильный способ подтвердить, что $a не соответствует действительности для функции empty(). - person PeanutsMonkey; 11.04.2011
comment
@PeanutsMonkey Да, чтобы изменить условие, используйте оператор отрицания !. Затем он читается, если если не пусто... - person alex; 11.04.2011

Null – это заполнитель, который обычно означает "данные об этом отсутствуют".

Использование null для этого является просто соглашением, но довольно широко распространенным, до такой степени, что некоторые языки программирования напрямую поддерживают это соглашение. Причина, по которой существует это соглашение, ИМХО исторически связана с «указателями»; много раз процедура будет определена для возврата указателя на ответ и будет возвращать то, что традиционно называется нулевым указателем, если по какой-то причине она не может дать ответ.

Пусто означает (если это набор), что в нем нет членов. Это явный ответ, и он сильно отличается от «нет данных об этом».

В мире PHP явно неинициализированные переменные имеют значение Null, и isset для такой переменной возвращает FALSE. Для массивов и строк PHP следует соглашению, согласно которому «пустой» означает «не имеет элементов», хотя технически массивы и строки не являются наборами.

У PHP, по-видимому, есть эта забавная идея, что 0 и 0.0 также «пусты» по дизайну PHP. ИМХО, это злоупотребление концепцией «пустой»: отдельные числа не являются наборами, поэтому 0 не может быть разумно «пустым». Это просто приводит к неясному программированию, потому что нарушает принцип наименьшего удивления. Я уверен, что разработчики PHP сочли бы, что «ноль — это пустое число» в качестве какой-то расплывчатой ​​аналогии; но если аналогия расплывчата, то зачем с ней возиться? Но тогда PHP полон глупых идей.

person Ira Baxter    schedule 11.04.2011

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

перейдите по этой ссылке для получения дополнительной информации https://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

person DEVARAJ JOHNSON    schedule 17.02.2015

NULL — это специальное значение, которое явно указывает, что переменной еще не было присвоено какое-либо значение. Будьте осторожны с использованием функции empty(), так как вы не можете просто определить, что переменная имеет точное значение NULL, используя ее. Например, функция empty() вернет значение true, если для int установлено значение 0. Если вам нужно убедиться, что переменная точно равна NULL, используйте if($variable == NULL).

Для получения дополнительной информации о empty() см. http://php.net/manual/en/function.empty.php

person Chris    schedule 11.04.2011

Здесь есть несколько хороших ответов, которые я не буду повторять. Однако в случае проверки форм при отправке формы значение каждого элемента ввода формы отправляется на сервер в переменной $_POST. Вы можете проверить наличие определенного ввода, используя isset().

isset($_POST['username'])

Если это возвращает true, то этот запрос к серверу был результатом публикации формы, содержащей элемент ввода с именем «имя пользователя». Теперь, когда мы знаем, что у нас есть значение для этого элемента формы, мы можем проверить, имеет ли оно допустимое значение. empty() сообщит нам, действительно ли пользователь ввел какие-либо данные в поле или оставил его пустым.

empty($_POST['username'])

Если это возвращает true, то в форме, отправленной на сервер, было поле с именем «имя пользователя», но пользователь ничего не вводил перед отправкой формы.

person Andrew Cooper    schedule 11.04.2011
comment
Итак, вместо того, чтобы проверять, была ли форма отправлена ​​с помощью isset, почему бы просто не использовать пусто, чтобы проверить, была ли отправлена ​​форма, а также, если пользователь ввел какие-либо данные? - person PeanutsMonkey; 11.04.2011
comment
Ты сможешь. empty() вернет true в любом случае, что и isset(). Какой из них вы используете, зависит от семантики, которую вы тестируете в данный момент. - person Andrew Cooper; 11.04.2011
comment
Хорошо. Я не слежу за семантикой, от которой это зависит. Как я узнаю или как я узнаю, что такое семантика? - person PeanutsMonkey; 11.04.2011
comment
Семантика относится к смыслу, который вы пытаетесь извлечь из теста. Если все, что вас волнует, это то, что форма была отправлена ​​с действительными (не пустыми) данными, используйте empty(). Если вы хотите проверить, действительно ли форма была отправлена ​​или что форма содержит определенное поле, вам нужно проверить, действительно ли существует переменная POST, поэтому вы используете isset(). - person Andrew Cooper; 11.04.2011
comment
Думаю, я понимаю, что вы имеете в виду. Я должен использовать соответствующие функции, основанные на условии, для которого я хотел бы вернуть true. Это правильно? Например, я знаю, что $_POST; вернул бы значение false, если бы я использовал функцию empty(), мне было бы лучше использовать isset. - person PeanutsMonkey; 11.04.2011
comment
Да. Вот более-менее. - person Andrew Cooper; 11.04.2011

Прошло некоторое время с тех пор, как я использовал PHP, но если другие языки пусты, это укажет на существующий объект/карту/массив, который не имеет содержимого, в то время как null укажет на переменную, которая вообще не имеет значения/определения (неинициализированная).

В SQL базы данных NULL означает «нет значения».

person SpliFF    schedule 11.04.2011

empty() - это хороший быстрый способ узнать, содержит ли переменная какую-либо полезную информацию... то есть для строк empty() возвращает true как для строки "", так и для нулевой строки.

Итак, вы можете написать что-то вроде этого:

if (! empty($name)) echo $name;

Подробнее см. здесь: PHP: empty()

person pmobley    schedule 11.04.2011

isset() возвращает true, если выполняются оба этих условия:

  1. Переменная была определена и еще не была отменена.
  2. В переменной есть ненулевое значение.

Переменная определяется автоматически, когда ей присваивается значение (включая null). Это имеет прямое отношение к массивам.

$a=array();
$a['randomKey']=true;
$a['nullKey']=null;
var_dump(isset($a['randomKey'])); // true
var_dump(isset($a['nullKey'])); // true, the key has been set, set to null!
var_dump(isset($a['unsetKey'])); // false !
unset($a['randomKey']);
var_dump(isset($a['randomKey'])); // false ! it's been unset!

Сверху вы можете проверить, установлены ли различные поля $_POST. Например, страница, на которую была отправлена ​​информация, имеет имя кнопки отправки в поле $_POST.

empty(), с другой стороны, проверяет, содержит ли переменная ненулевое значение. Это означает, что значения, которые (int) приводятся к 0, также возвращают false. Вы можете использовать это, чтобы увидеть, есть ли в конкретном поле $_POST данные.

person Khez    schedule 11.04.2011

Эту концепцию можно лучше понять из математики. Вы когда-нибудь пытались разделить число (не ноль) на 0 с помощью калькулятора, например, 7/0? Вы получите результат, который выглядит примерно так: undefined, not a number, null и т. д. Это означает, что операция невозможна по некоторым причинам (давайте оставим эти причины для обсуждения в другой раз).

Теперь выполните следующее: 0/7. Вы получите на выходе 0. Это означает, что операция возможна и может быть выполнена, но вы ответите просто 0, потому что после деления ничего не остается. Есть действительный вывод, и этот вывод равен нулю.

В первом примере не только вывод был неверным, но и операция не могла быть выполнена. Это похоже на null. Второй пример похож на empty.

person Community    schedule 02.11.2017