- Что такое null и как с этим жить: сравнение с null в PHP, тонкости в приведении типов данных
- Математические операции с null
- Проверка переменной на null
- Проверка null if-выражениях, а так же в функциях empty() и isset()
- Сравнение двух null
- Поведение null при нетождественном сравнении с приведением типов данных
- Сравнение с null с помощью >, =, PHP -> JavaScript) поведение null может меняться.
- Простое правило при работе null, которое помогает избегать проблем
- FALSE, NULL и пустые значения — проверка условий и работа с ними
- Небольшое описание примеров проверки выполнения условий на PHP. Данный материал поможет разобраться Вам в понимании механизма работы проверки условий на PHP для разных типов переменных
- FALSE в If-выражениях
- Функция is_null() и языковые конструкции isset() и empty()
- Индексация массивов
- Строковое представление
- Операторы сравнения
- Выводы
- Php null что это значит
- is_null
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 9 notes
Что такое null и как с этим жить: сравнение с null в PHP, тонкости в приведении типов данных
В работе с любыми данными то и дело требуется как-то обозначить их отсутствие. Новички зачастую для этой цели используют значение false, которое, по сути, является не отсутствием данных, а определённым значением типа boolean. Для того, чтобы как-то помечать неопределённость или отсутствие данных, существует специальное значение null. Про false, null и прочее уже немало сказано и добавить что-то оригинальное крайне сложно. Но гораздо сложнее бывает найти баг, вызванный неочевидным поведением этих штуковин. Поэтому, вдохновлённый одним таким багом, самым элегантным в моём послужном списке, я решил написать маленькую шпаргалку на эту тему.
Перегружать пост интересными, но довольно-таки бесполезными определениями из Википедии я не стану. Вместо этого перейду сразу к делу и приведу цитату со страницы php.net, посвящённой null:
Специальное значение NULL представляет собой переменную без значения. NULL — это единственно возможное значение типа null. Переменная считается null, если:
- ей была присвоена константа NULL.
- ей еще не было присвоено никакого значения.
- она была удалена с помощью unset().
До этого момента всё кажется простым, но чтобы так оставалось и дальше, при работе с null нужно придерживаться определённых правил.
Математические операции с null
Во всех математических операциях null ведёт себя аналогично int(0):
Проверка переменной на null
Чтобы точно узнать, что переменная содержит null (то есть, ничего не содержит), нужно использовать либо специальную функцию is_null() либо тождественное сравнение ===, а любые другие способы не подойдут:
Проверка null if-выражениях, а так же в функциях empty() и isset()
Тут переменные с null ведут себя абсолютно предсказуемо, как и любые другие ложные значения (которые в if-выражениях приводятся к false). Но нужно помнить, что это не гарантирует нам, что в переменной находится именно null:
Сравнение двух null
В PHP как гибкое, так и тождественное сравнение двух null всегда возвращает false, в отличие от многих других платформ, где сравнение двух неизвестностей возвращает так же неизвестность (то есть, null).
Поведение null при нетождественном сравнении с приведением типов данных
PHP разрешает сравнивать null-ы не только между собой, но и с другими типами данных. При этом не стоит забывать, что гибкое сравнение в php не является транзитивным, то есть, если два значения равны третьему по отдельности, не гарантирует их равенство между собой. Согласно таблицам приведения типов, гибкое сравнение null при помощи оператора == с разными значениями возвращает разные результаты:
Сравнение с null с помощью >, =, PHP -> JavaScript) поведение null может меняться.
Исследование null в JavaScript (а вместе с ним и загадочного undefined) заслуживает отдельной статьи. Главное отличие состоит в том, что, не смотря на приведение типов, null в JavaScript ничему не равен, кроме самого null и этого самого undefined, хотя в if-выражениях и срабатывает аналогично false. А при сравнении с числами он выдаёт ещё более забавные результаты, чем в PHP.
NULL в MySQL, к примеру, действует гораздо более прямолинейно. Он просто при любых действиях с null (даже при сравнении двух null) возвращает null. С его точки зрения, при любых действиях с неизвестностью в результате получится какая-то другая неизвестность 🙂
Простое правило при работе null, которое помогает избегать проблем
Вообще-то, не стоило читать этот пост. Держать в голове все эти нюансы, которые разные платформы трактуют по-разному, — неблагодарное занятие. Для того, чтобы избежать проблем с null нужно запомнить всего лишь одно правило:
Источник
FALSE, NULL и пустые значения — проверка условий и работа с ними
Небольшое описание примеров проверки выполнения условий на PHP. Данный материал поможет разобраться Вам в понимании механизма работы проверки условий на PHP для разных типов переменных
Небольшое описание примеров проверки выполнения условий на PHP.
Данный материал поможет разобраться Вам в понимании механизма работы проверки условий на PHP для разных типов переменных
FALSE в If-выражениях
В соответствии с документацией PHP следующие значения равны FALSE после приведения в тип boolean:
- само булевское значение FALSE
- integer 0
- float 0.0
- пустая строка (string) («») и строка «0».
- пустой массив (array) – array().
- an object with zero member variables (только в PHP 4, в статье не рассматривается)
- специальное значение NULL (включая неустановленные переменные)
- SimpleXML objects (в данной статье не рассматривается)
Это значит, что если такие значения, передаются в условие:
то будет выведена строка «0».
Если значение переменной не установлено (unset), то еще и может выдаваться предупреждение. Напомним, предупреждение в условии можно убрать, написав перед переменной @.
Но использовать @ стоит только в крайних случаях, когда вы хорошо подумали и других подходящих вариантов нет. См. функцию isset().
Функция is_null() и языковые конструкции isset() и empty()
is_null() возвращает TRUE только для переменных, которым не присвоено никакого значения или которым присвоено значение NULL.
isset() возвращает один в один противоположные булевые значения в сравнении с is_null().
Если переменной не присвоено значение, то is_null() также выдает предупреждение «Undefined variable», в отличии от isset(), которая не выдает никаких предупреждение.
Напомним, для того, чтобы убрать значение переменной, можно использовать функцию unset(). Также с этой целью можно присвоить значение NULL, чтобы избежать предупреждений компилятора при попытке чтения значения переменной.
Обратите внимание, что в отличии от переменных для работы с константами необходимо использовать конструкцию defined().
С empty() все просто – возвращает TRUE для истинных значений, FALSE – для всех остальных, полностью в соответствии со списком выше, взятым из документации. Кстати, для тех кто будет экспериментировать самостоятельно, в empty() аргументом можно передать только переменную. При попытке передать константу компилятор выдает синтаксическую ошибку.
Индексация массивов
При работе с массивами все ложные значения будут обращаться к одному элементу.
Исключением являются только значения индексов пустой строки (») и NULL — для этих двух значений используется отдельное место в памяти.
Также значение пустого массива array(), как впрочем и любого другого массива, не может быть индексом массива – компилятор выдает предупреждение «Illegal offset type» и значение, соответствующее такому индексу, не устанавливается.
Для того, чтобы индексам пустой строки и NULL соответствовали различные елементы в массиве, можно использовать следующий подход. Опишем функцию:
Далее при установке значений мы получим отдельные индексы для пустой строки и значения NULL, точнее будем эмулировать различные индексы:
Индексы массивов — это отдельная тема. Приведу лишь пример того, что значение с целочисленным индексом $arr[555] совпадает со значением соответствующее строковыму индексу $arr[‘555’] в массиве.
Такие особенности прежде всего связаны с тем, что индексы массивов либо целые, либо строки. Более детальная информация может быть найдена в описании типа массива в руководстве php.
Строковое представление
Расмотрим строковое представление ложных констант.
Например при конкатенации значения преобразуются в следующие строки, приведенные в таблице ниже:
Значение | Строка |
---|---|
FALSE | (пустая строка) |
0 | 0 |
0.0 | 0 |
«» | (пустая строка) |
«0» | 0 |
array() | Array |
NULL | (пустая строка) |
@$undef | (пустая строка) |
Более подробно тема преобразования в строки описана на официальном сайте в параграфе Converting to string.
Операторы сравнения
Перейдем к операторам сравнения.
Все ложные значения, как и ожидалось, возвращают истину при сравнении со значением FALSE при помощи оператора «==».
Но не следует здесь расчитывать на транзитивность при сравнении ложных строковых констант между собой.
Приведем полную таблицу сравнения ложных значение (плюсом обозначены элементы таблицы, которые при сравнении с помощью оператора «!=» возвращают истинное значение:
!= | FALSE | 0 | 0.0 | «» | «0» | array() | NULL | @$undef |
---|---|---|---|---|---|---|---|---|
FALSE | ||||||||
0 | + | |||||||
0.0 | + | |||||||
«» | + | + | ||||||
«0» | + | + | + | + | ||||
array() | + | + | + | + | ||||
NULL | + | |||||||
@$undef | + |
$undef –переменная, которой не присваивалось значение
Из таблицы можно сделать некоторые приятные выводы:
1. Если мы знаем, что у нас используются только строки, то мы их можем спокойно сравнивать и не беспокоиться, что «» (пустая строка) будет равна «0».
2. Массивы никогда не равны строкам, целым и действительным числам.
Поскольку тип различных ложных констант разный, то для того, чтобы их отличать можно использовать пару операторов === и !==.
Оператор === возвращает ложное значение для всех пар ложных значений.
Истинное значение возвращает лишь для аргументов, одному из которых присвоено значение NULL, а второму не присвоено никакого значения.
Отличие переменных с NULL значением и неопределенных переменных
Оператор === позволяет различать все ложные значения, кроме как переменных с NULL-значением от переменных, которым значение не присваивалось.
Такие переменные можно отличить с помощью функции get_defined_vars().
Если нужно определить, было ли присвоено значение переменной $var, то для этого может быть использован следующий фрагмент код:
Выводы
Всегда нужно помнить, что в PHP два ложных значения могут быть не равны между собой, а переменные, которые, на первый взгляд, разные, могут оказаться одинаковыми при сравнении. Чтобы избежать таких сюрпризов, можно воспользоваться операторами === и !==.
При работе с массивами, во избежание сюрпризов, можно написать функцию конвертирования значений в гарантированно различные индексы. После этого к элементам массива обращаться только с ее помощью. Это может замедлить работу программы, но поможет избежать сюрпризов.
Источник
Php null что это значит
I would like to add for clarification that:
—$x;
// $x is still NULL.
// Decrementing NULL, using Decrement Operator, gives NULL.
$x-=1;
// $x is now int(-1).
// This actually decrements value by 1.
On the other hand, Incrementation works simply as expected.
Hope this helps 🙂
NULL is supposed to indicate the absence of a value, rather than being thought of as a value itself. It’s the empty slot, it’s the missing information, it’s the unanswered question. It’s not a jumped-up zero or empty set.
This is why a variable containing a NULL is considered to be unset: it doesn’t have a value. Setting a variable to NULL is telling it to forget its value without providing a replacement value to remember instead. The variable remains so that you can give it a proper value to remember later; this is especially important when the variable is an array element or object property.
It’s a bit of semantic awkwardness to speak of a «null value», but if a variable can exist without having a value, the language and implementation have to have something to represent that situation. Because someone will ask. If only to see if the slot has been filled.
Note: Non Strict Comparison ‘==’ returns bool(true) for
Note that NULL works like a magic object with any attribute you can name, but they are all NULL:
foreach ( [ null, null ] as $person ) <
$friends[] = [ ‘Name’=>$person[‘name’], ‘Phone’=>$person[‘cell’] ];
>
This means that:
* NULL == NULL[‘foo’][‘bar’][‘whatever’]
This can be slightly confusing if you accidentally slip a NULL into an array of other items.
Pay attention then using operator — on NULL values:
$x = null;
—$x; // $x is NULL
$x—; // still NULL
$x -= 1; // $x is -1
On other side for ++ everything works fine:
Источник
is_null
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
is_null — Проверяет, является ли значение переменной равным null
Описание
Проверяет, является ли значение данной переменной равным null .
Список параметров
Возвращаемые значения
Возвращает true , если значение value равно null , или false в противном случае.
Примеры
Пример #1 Пример использования is_null()
$foo = NULL ;
var_dump ( is_null ( $inexistent ), is_null ( $foo ));
Смотрите также
- Тип null
- isset() — Определяет, была ли установлена переменная значением, отличным от null
- is_bool() — Проверяет, является ли переменная булевой
- is_numeric() — Проверяет, является ли переменная числом или строкой, содержащей число
- is_float() — Проверяет, является ли переменная числом с плавающей точкой
- is_int() — Проверяет, является ли переменная целым числом
- is_string() — Проверяет, является ли переменная строкой
- is_object() — Проверяет, является ли переменная объектом
- is_array() — Определяет, является ли переменная массивом
User Contributed Notes 9 notes
Micro optimization isn’t worth it.
You had to do it ten million times to notice a difference, a little more than 2 seconds
$a===NULL; Took: 1.2424390316s
is_null($a); Took: 3.70693397522s
difference = 2.46449494362
difference/10,000,000 = 0.000000246449494362
The execution time difference between ===NULL and is_null is less than 250 nanoseconds. Go optimize something that matters.
See how php parses different values. $var is the variable.
$var = NULL «» 0 «0» 1
strlen($var) = 0 0 1 1 1
is_null($var) = TRUE FALSE FALSE FALSE FALSE
$var == «» = TRUE TRUE TRUE FALSE FALSE
!$var = TRUE TRUE TRUE TRUE FALSE
!is_null($var) = FALSE TRUE TRUE TRUE TRUE
$var != «» = FALSE FALSE FALSE TRUE TRUE
$var = FALSE FALSE FALSE FALSE TRUE
In PHP 7 (phpng), is_null is actually marginally faster than ===, although the performance difference between the two is far smaller.
PHP 5.5.9
is_null — float(2.2381200790405)
=== — float(1.0024659633636)
=== faster by
PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null — float(1.4121870994568)
=== — float(1.4577329158783)
is_null faster by
For what I realized is that is_null($var) returns exactly the opposite of isset($var) , except that is_null($var) throws a notice if $var hasn’t been set yet.
the following will prove that:
= array( null , true , false , 0 , 1 , » , «\0» , «unset» );
foreach( $quirks as $var ) <
if ( $var === «unset» ) unset( $var );
echo is_null ( $var ) ? 1 : 0 ;
echo isset( $var ) ? 1 : 0 ;
echo «\n» ;
>
?>
this will print out something like:
10 // null
01 // true
01 // false
01 // 0
01 // 1
01 // »
01 // «\0»
Notice: Undefined variable: var in /srv/www/htdocs/sandbox/null/nulltest.php on line 8
10 // (unset)
For the major quirky types/values is_null($var) obviously always returns the opposite of isset($var), and the notice clearly points out the faulty line with the is_null() statement. You might want to examine the return value of those functions in detail, but since both are specified to return boolean types there should be no doubt.
A second look into the PHP specs tells that is_null() checks whether a value is null or not. So, you may pass any VALUE to it, eg. the result of a function.
isset() on the other hand is supposed to check for a VARIABLE’s existence, which makes it a language construct rather than a function. Its sole porpuse lies in that checking. Passing anything else will result in an error.
Knowing that, allows us to draw the following unlikely conclusion:
isset() as a language construct is way faster, more reliable and powerful than is_null() and should be prefered over is_null(), except for when you’re directly passing a function’s result, which is considered bad programming practice anyways.
Источник