Вопрос

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

Это было полезно?

Решение

Это зависит от языка, но на PHP :

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

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 (установить в положение вкл.) и DebugMode = Null (не задано вообще, приведет к жесткой отладке ;-)).

Другие советы

null является null. false является false.Печально, но это правда.

в PHP не так уж много согласованности.разработчики ПОПРОБУЙ значение null означает "неизвестный" или "несуществующий".но часто 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.То же самое касается и != против !==.Также на случай, если вы сравните null что касается двух других, использующих упомянутые операторы, ожидайте аналогичных результатов.

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

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

False, Null, Ничего, 0, Не определено, и т.д., и т.п.

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

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

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

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

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

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

Я только что потратил впустую 1/2 доллара в день, пытаясь получить либо 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?

Из самого Онлайн-документация по 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.

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

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

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

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

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

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

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

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

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

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

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

char GetChar()

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

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

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

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

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

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

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

0 является целочисленным значением.

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

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

Null - это ничто, False - это бит, а 0 - это (вероятно) 32 бита.

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

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

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

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

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

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

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

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

x + 0 = x

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

x || False = x

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

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

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

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

Проблемы с ложностью проистекают из истории 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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top