Null против False против 0 в PHP

Мне сказали, что хорошие разработчики могут определить/использовать разницу между Null и False и 0 и всеми другими хорошими "ничего" сущностями.
В чем разница, особенно в PHP? Связано ли это с ===?

Ответ 1

Этот язык специфичен, но в PHP:

Null означает " ничего". Var не был инициализирован.

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

0 - int. Ничего общего с остальными выше, используемыми для математики.

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

Если вы протестируете его с помощью ==, он проверяет логическое значение, поэтому вы получите равенство. Если вы проверите его с помощью ===, он проверит тип, и вы получите неравенство.

Так почему они полезны?

Хорошо, посмотрите на функцию strrpos(). Он возвращает False, если ничего не нашел, но 0, если он нашел что-то в начале строки!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

И, конечно, если вы имеете дело с состояниями:

Вы хотите сделать разницу между DebugMode = False (отключено), DebugMode = True (установлено значение on) и DebugMode = Null (не установлено вообще, приведет к жесткой отладке; -)).

Ответ 2

null - null. false - false. Грустно, но это правда.

в PHP не так много согласованности. разработчики TRY, чтобы сделать null, означает "unkown" или "несуществующий". но часто False будет служить "несуществующим" (например, strrpos ( "fail", "search" ) вернет false, а не null)

вы часто увидите, что null используется, когда они уже используют false для чего-то. например filter_input(). Они возвращают false, если переменная не работает с фильтром. и null, если переменная не существует (не существует означает, что она также не сработала с фильтром, поэтому зачем даже возвращать null?!?)

php имеет удобство возврата данных в функции. и из-за того, что разработчики записывают все виды отказа, а не данные.

И в PHP нет здравого смысла для обнаружения данных (int, str и т.д.) из отказа (false, null)

вы в значительной степени должны всегда тестировать === null или === false, в зависимости от функции. или для обоих, в таких случаях, как filter_input()/filter_var()

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

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)

Ответ 3

Ниже приведен пример:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

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

Ответ 4

False, Null, Nothing, 0, Undefined и т.д. и т.д.

Каждый из них имеет конкретные значения, которые коррелируют с реальными понятиями. Иногда несколько значений перегружаются в одно ключевое слово или значение.

В C и С++, NULL, False и 0 перегружены до того же значения. В С# они представляют собой 3 различных понятия.

NULL или NULL обычно указывает на отсутствие значения, но обычно не указывает, почему. 0 указывает натуральное число ноль и имеет эквивалентность типа 1, 2, 3, и т.д., а на языках, поддерживающих отдельные понятия NULL, следует обрабатывать только число.

False указывает на неверность. И он используется в двоичных значениях. Это не означает, что это не значит, что это не означает 0. Он просто указывает одно из двух двоичных значений.

Ничто не может указывать на то, что значение специально установлено как ничего, что указывает на то же, что и значение null, но с намерением.

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

Ответ 5

В PHP вы можете использовать операторы === и! == для проверки не только, если значения равны, но и соответствуют ли их типы. Например, 0 == false - true, но 0 === false - false. То же самое относится к != по сравнению с !==. Также, если вы сравните null с двумя другими, используя упомянутые операторы, ожидайте аналогичные результаты.

Теперь в PHP это качество значений обычно используется при возврате значения, которое иногда может быть 0 (ноль), но иногда может быть, что функция не удалась. В таких случаях в PHP вы возвращаете false, и вам нужно проверить эти случаи с помощью оператора идентификации ===. Например, если вы ищете позицию одной строки внутри другой и используете strpos(), эта функция вернет числовую позицию, которая может быть 0, если строка найдена в самом начале, но если строка не найден вообще, тогда strpos() вернет false, и вы должны принять это во внимание при работе с результатом.

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

Ответ 6

Я только что потерял половину дня, пытаясь получить 0, null, false чтобы вернуться из strops !

Вот все, что я пытался сделать, прежде чем я обнаружил, что логика не движется в правильном направлении, и казалось, что в кодировании php была черная дыра:

Концепция взять доменное имя, размещенное на сервере, и убедиться, что это не корневой уровень, ОК, несколько разных способов сделать это, но я выбрал другой из-за других функций/конструкций php, которые я сделал.

Во всяком случае, здесь была основа изложения:

if (strpos($_SERVER ['SERVER_NAME'], dirBaseNAME ()) 
{ 
    do this 
} else {
    or that
}

{
echo strpos(mydomain.co.uk, mydomain);  

if ( strpos(mydomain, xmas) == null ) 
    {
        echo "\n1 is null"; 
    }

if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) 
    {
        echo "\n2 is 0"; 
    } else {
        echo "\n2 Something is WRONG"; 
    }

if ( (mydomain.co.uk, mydomain)) != 0 ) 
    {
        echo "\n3 is 0"; 
    } else {
        echo "\n3 it is not 0"; 
    }

if ( (mydomain.co.uk, mydomain)) == null ) 
    {
        echo "\n4 is null"; 
    } else {
        echo "\n4 Something is WRONG"; 
    }
}

НАКОНЕЦ, прочитав эту тему, я обнаружил, что это работает !!!

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

Спасибо за эту статью, теперь я понимаю, что, хотя это Рождество, оно не может быть Рождеством, как false, поскольку это также может быть NULL день!

Потратив один день на отладку некоторого простого кода, хотелось бы, чтобы я знал об этом раньше, так как я смог бы выявить проблему, а не пытаться заставить ее работать. Это не сработало, так как False, NULL и 0 не совпадают с True or False or NULL?

Ответ 7

Из онлайновой документации PHP:

Чтобы явно преобразовать значение в логическое значение, используйте приведение (bool) или (boolean).
Однако в большинстве случаев приведение не является необходимым, поскольку значение будет автоматически преобразовано, если для оператора, функции или структуры управления требуется логический аргумент.
При преобразовании в логическое значение следующие значения считаются ЛОЖНЫМИ:

  • само логическое FALSE
  • целое число '' 0 (ноль)
  • Поплавок 0.0 (ноль)
  • пустая строка и строка "0"
  • массив с нулевыми элементами
  • объект с нулевыми переменными-членами (только PHP 4)
  • специальный тип NULL (включая неустановленные переменные)
  • SimpleXML объекты, созданные из пустых тегов
    Любое другое значение считается TRUE (включая любой ресурс).

Так что, в большинстве случаев, это одно и то же.

С другой стороны, === и == - это не одно и то же. Как правило, вам просто нужен оператор "равно". Чтобы уточнить:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Для получения дополнительной информации посетите страницу " Операторы сравнения " в онлайн-документации по PHP.

Надеюсь это поможет.

Ответ 8

Различия между этими значениями всегда сводятся к подробным языковым правилам. То, что вы изучаете для PHP, не обязательно верно для Python, Perl или C и т.д. Хотя полезно изучить правила для языка (ов), с которым вы работаете, полагаться на них слишком много, это требует неприятностей, Проблема возникает, когда следующий программист должен поддерживать ваш код, и вы использовали некоторую конструкцию, которая использует некоторые небольшие детали Null vs. False (например). Ваш код должен выглядеть корректно (и, наоборот, неправильный код должен выглядеть неправильно).

Ответ 9

Null используется в базах данных для представления "no record" или "no information". Таким образом, у вас может быть поле бит, в котором описывается, "этот пользователь хочет, чтобы нас отправляли электронные письма", где True означает, что они это делают, False означает, что они не хотят ничего отправлять, но Null означает, Знаю. Они могут возникать через внешние соединения и тому подобное.

Логические последствия Null часто различны - на некоторых языках NULL не равно никому, поэтому if (a == NULL) всегда будет false.

Так что лично я всегда инициализировал логическое значение FALSE, а инициализация одного в NULL выглядела бы немного icky (даже в C, где оба оба только 0... просто стиль).

Ответ 10

В PHP это зависит от того, проверяете ли вы типы:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Технически null - это 0x00, но в PHP ( null == 0x00 ) && ( null !== 0x00 ).

0 - целочисленное значение.

Ответ 11

Я думаю, что плохие разработчики находят все разные варианты использования null/0/false в коде.

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

// On error GetChar returns -1
int GetChar()

Это пример интерфейса сахара. Это изложено в книге "Отладка процесса разработки программного обеспечения", а также в другой книге "Написание правильного кода".

Проблема с этим - это импликация или предположения, сделанные в типе char. В некоторых компиляторах тип char может быть не подписан. Поэтому, даже если вы вернете -1, компилятор может вместо этого вернуть 1. Подобные предположения компилятора в С++ или C трудно обнаружить.

Вместо этого лучше всего не смешивать код ошибки с вашими данными. Итак, следующая функция.

char GetChar()

теперь становится

// On success return 1
// on failure return 0
bool GetChar(int &char)

Это означает, что независимо от того, насколько молодой разработчик находится в вашем магазине разработки, он или она никогда не поймут это неправильно. Хотя это не говорит о переделке или зависимостях в коде.

Итак, в общем случае, обмен файлом bool, как тип первого класса на этом языке, в порядке, и я думаю, что joel рассказал об этом с его недавним postcast. Но постарайтесь не использовать mix и match bools с вашими данными в ваших подпрограммах, и вы должны быть в порядке.

Ответ 12

Один интересный факт о NULL в PHP: если вы установите переменную равной NULL, она будет такой же, как если бы вы вызывали unset() для нее.

NULL существу означает, что переменной не присвоено значение; false - это допустимое логическое значение, 0 - допустимое целочисленное значение, а PHP имеет довольно уродливые преобразования между 0, "0", "" и false.

Ответ 13

Null - ничто, False - бит, а 0 - (возможно) 32 бита.

Не эксперт по PHP, но на некоторых более современных языках они не взаимозаменяемы. Я как бы пропустил, имея 0 и false, чтобы быть взаимозаменяемым, но с булевым, являющимся фактическим типом, вы можете иметь связанные с ним методы и объекты, чтобы просто компромисс. Нуль является нулевым, но в нем нет ничего существенного.

Ответ 14

Ну, я не могу вспомнить достаточно из моих дней PHP, чтобы ответить на часть "===", но для большинства языков C-стиля NULL следует использовать в контексте значений указателя, false как булевский и ноль как числовое значение, такое как int. '\ 0' является обычным значением для символьного контекста. Я обычно предпочитаю использовать 0.0 для поплавков и парных.

Итак, быстрый ответ: контекст.

Ответ 15

В почти всех современных языках null логически ссылается на указатели (или ссылки), не имеющие значения, или переменную, которая не инициализирована. 0 - целочисленное значение нуля, а false - логическое значение, ну, false. Чтобы усложнить ситуацию, в C, например, null, 0 и false все представлены точно так же. Я не знаю, как это работает в PHP.

Затем, чтобы усложнить ситуацию, базы данных имеют понятие null, что означает отсутствие или неприменимость, и большинство языков не имеют прямого способа сопоставления DBNull с их нулевым значением. До недавнего времени, например, не было никакого различия между int, равным нулю, и равным нулю, но это было изменено с помощью NULL int.

Извините, что этот звук сложный. Это просто то, что в течение многих лет это была точка привязки гарри на языках, и до недавнего времени у нее не было четкого разрешения нигде. Люди обычно просто объединяют вещи вместе или делают пустой или 0 представляют нули в базе данных, что не всегда работает слишком хорошо.

Ответ 16

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

Другими словами, 0 можно определить как число, которое при добавлении к некоторому натуральному числу дает такое же число:

x + 0 = x

Аналогично, False - это такое значение, что его дизъюнкция и любое другое значение имеют то же значение:

x || False = x

Null концептуально что-то совершенно другое. В зависимости от языка для него существуют разные семантики, но ни одна из них не описывает "начальное значение" как False и 0. Для Null нет алгебры. Он относится к переменным, как правило, для обозначения того, что переменная не имеет определенного значения в текущем контексте. В большинстве языков на Null не определены операции, и это ошибка использования Null в качестве операнда. На некоторых языках есть специальное значение, называемое "bottom", а не "null", которое является заполнителем для значения вычисления, которое не заканчивается.

Я более подробно написал о последствиях NULL в других местах.

Ответ 17

Кто-нибудь может объяснить мне, почему 'NULL' не просто строка в экземпляре сравнения?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!

Ответ 18

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

http://www.isolani.co.uk/blog/javascript/TruthyFalsyAndTypeCasting

Ответ 19

Проблемы с ложностью происходят из истории PHP. Проблема нацелена на плохо определенный скалярный тип.

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

Строгость PHP7 - это шаг вперед, но, возможно, этого недостаточно. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/