В чем смысл is_null ()?

У меня вопрос относительно использования is_null().

Я читал другие вопросы, посвященные is_null ($ x) по сравнению с null === $ x, но меня больше беспокоит, зачем вообще есть is_null() функция?

Несколько тестов, чтобы объяснить мои мысли:

<?php

header('Content-type: text/plain');
error_reporting(-1);

$test = 'Hello, World!';
$test2 = null;
$test3 = '';

var_dump(is_null($test));
var_dump(null === $test);
var_dump(isset($test));

var_dump(is_null($test2));
var_dump(null === $test2);
var_dump(isset($test2));

var_dump(is_null($test3));
var_dump(null === $test3);
var_dump(isset($test3));

var_dump(is_null($test4));
var_dump(null === $test4);
var_dump(isset($test4));

что даст следующий результат:

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

Notice: Undefined variable: test4 in C:\home\ombrelle.co.uk\templates_core\test.php on line 22
bool(true)

Notice: Undefined variable: test4 in C:\home\ombrelle.co.uk\templates_core\test.php on line 23
bool(true)
bool(false)

Как видите, при использовании функции is_null() или метода сравнения будет выведено уведомление, поэтому вы вынуждены использовать вместо этого isset(). Таким образом, единственный способ никогда не увидеть уведомление с помощью этих методов - это когда оно не null?

Также учтите следующее:

<?php

header('Content-type: text/plain');
error_reporting(-1);

var_dump((is_null($test1)) ? 'test1' : $test);
var_dump((null == $test2) ? 'test2' : $test);
var_dump((isset($test3)) ? 'test3' : $test);

дает следующий результат:

Notice: Undefined variable: test1 in C:\home\ombrelle.co.uk\templates_core\test.php on line 6
string(5) "test1"

Notice: Undefined variable: test2 in C:\home\ombrelle.co.uk\templates_core\test.php on line 7
string(5) "test2"

Notice: Undefined variable: test in C:\home\ombrelle.co.uk\templates_core\test.php on line 8
NULL

Здесь в тернарном выражении вышеупомянутая работа по-прежнему с уведомлениями, однако метод isset() теперь не работает вообще. Как правильно это сделать, не показывая уведомлений?

После всего этого, могу ли я просто согласиться с тем, что уведомления бессмысленны и не должны отправляться в мой журнал ошибок, или есть какие-то другие предостережения, которые я должен учитывать?

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


person LeonardChallis    schedule 03.03.2014    source источник
comment
Кажется, что вы не различаете переменную, имеющую значение null, и переменную, которая не определена. Это разные вещи.   -  person Jakub Matczak    schedule 03.03.2014
comment
Другими словами: is_null - это функция, как и is_bool, is_int, is_ ‹whatever›. Только поскольку нулевой тип имеет только 1 возможное значение, на практике он равен === null. Это похоже на то, что is_bool равно ($ var === true или $ var === false). Несуществующая переменная при сравнении обрабатывается как переменная без значения (т.е. null) и, следовательно, возвращает true для null === $ undefined. Однако при передаче функции без переменной в качестве аргумента функция ничего не получает, хотя ожидает хоть что-то и, таким образом, возвращает уведомление.   -  person Tularis    schedule 03.03.2014
comment
Я думаю, что меня смутило то, что $something = null; var_dump(isset($something)); выведет false. Это не на самом деле выдает ошибку при использовании is_null, если для него установлено значение null. Странный. Или я глупый?   -  person LeonardChallis    schedule 03.03.2014


Ответы (2)


is_null() Проверяет, является ли переменная NULL

Вам действительно нужен isset(), который определяет, установлена ​​ли переменная и не является ли она NULL. Возвращает TRUE, если переменная существует и имеет значение, отличное от NULL, иначе FALSE.

Например,

$something = null; then isset($something) returns false
$something = 'some value'; then isset($something) returns true
person Linga    schedule 03.03.2014
comment
Как я уже упоминал в ответе на @Tularis выше, когда я помещаю $something = null; var_dump(isset($something));, он вернет false. Итак, если я не знал, что он действительно установлен (т.е. не во время кода), я не мог использовать is_null, верно? - person LeonardChallis; 03.03.2014

Единственная разница, о которой я могу думать (кроме того, что она намного медленнее - как ответ в связанном ответе, который вы опубликовали), заключается в том, что is_null позволяет использовать ужасный оператор @ :

<?php
    error_reporting(E_ALL);

    var_dump($foo === null); //Notice
    var_dump(@is_null($foo)); //No notice
?>

ДЕМО

Тем не менее, если вы не уверены, существует ли переменная, вам следует использовать isset, а не is_null.

Кроме того, вас может заинтересовать Лучший способ проверить наличие переменной в PHP; isset () явно не работает

person h2ooooooo    schedule 03.03.2014
comment
is_null - это способ проверить type переменной. === null проверяет type и value. Поскольку null type имеет только одно возможное значение, на практике эти два значения одинаковы. Однако is_null существует для обеспечения единообразия языка (т.е. как параллель с is_bool, is_int, is_object, is_array и т. Д.) - person Tularis; 03.03.2014