Intereting Posts
PHP и regexp принимают только греческие символы в форме PHP 5.4: почему классы могут переопределять методы признаков с другой подписью? Поиск строки в php, поле поиска содержит пробел Laravel 4 – Как использовать «смещение» вместо «страницы» с помощью Eloquent's -> paginate ()? PHP / PDO: Подготовленные утверждения не работают при создании таблицы? Как проверить подпись с phpseclib в сообщении подписи XML? Выполнение вычислений в MySQL и PHP Создать файл .ics динамически Получение первого URL-адреса результата поиска изображения с помощью API изображений Google в PHP Как добавить все значения в массив? Outlook Rest Api отправляет почтовый запрос статус возврата 400 PHPUnit: ожидание вызова метода с массивом в качестве аргумента Запустить функцию PHP на документе? Исключение SoapFault: Неподдерживаемый тип носителя при доступе к веб-сервису Java с PHP Как получить доступ к файлу php.ini в гостевом хостинге godaddy

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

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

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

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

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

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

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

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

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

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

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

И, конечно, если вы имеете дело с государствами:

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

nullnull . 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) 

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

  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 и даст вам четкое понимание.

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

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

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

False, Null, Nothing, 0, Undefined и т. Д. И т. Д.

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

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

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

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

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

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

Я только потратил впустую 1/2 в день, пытаясь получить либо 0, нулевой, ложный возврат от strpos!

Вот все, что я пытался сделать, прежде чем обнаружил, что логика не течет в правильном направлении, кажется, что в 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 и 0 не все равно True или False или null?

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

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

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

Поэтому лично я всегда инициализировал логическое значение FALSE, а инициализация одного в NULL выглядела бы немного нехорошо (даже в C, где оба оба просто 0 … просто стиль).

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

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

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

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

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

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

 char GetChar() 

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

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

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

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

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

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

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

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

Нуль – ничто, False – немного, а 0 – (возможно) 32 бита.

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

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

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

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

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

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

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

"* Чтобы явно преобразовать значение в boolean, используйте (bool) или (boolean) приведения. Однако в большинстве случаев приведение не имеет никакого значения, поскольку значение будет автоматически преобразовано, если оператор, функция или структура управления требует логического аргумента При преобразовании в boolean следующие значения считаются FALSE: * логическое FALSE само * целое число 0 (ноль) * float 0.0 (ноль) * пустая строка, а строка «0» * – массив с нулевыми элементами * объект с нулевыми переменными-членами (только для PHP 4) * специальный тип NULL (включая неустановленные переменные) * Объекты SimpleXML, созданные из пустых тегов Каждое другое значение считается TRUE (включая любой ресурс). * "

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

С другой стороны, «===» и «==» – это не одно и то же. Регулярно вам просто нужен оператор «equals». Чтобы уточнить:

 $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.

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

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

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

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

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

 x + 0 = x 

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

 x || False = x 

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

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

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

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