Нулевой против Ложного против 0 в PHP - PullRequest
135 голосов
/ 26 сентября 2008

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

Ответы [ 18 ]

1 голос
/ 26 сентября 2008

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

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

1 голос
/ 26 сентября 2008

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

0 голосов
/ 01 февраля 2019

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

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!
0 голосов
/ 04 ноября 2018

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

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

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

Строгость PHP7 - это шаг вперед, но, возможно, этого недостаточно. https://web -techno.net / типирование-с PHP-7-что-вы-не должны делать-/

0 голосов
/ 26 сентября 2008

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

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

0 голосов
/ 26 сентября 2008

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

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

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

0 голосов
/ 26 сентября 2008

Ноль - это ничто, Ложь - бит, а 0 - (вероятно) 32 бита.

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

0 голосов
/ 26 сентября 2008

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

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

x + 0 = x

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

x || False = x

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

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

...