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

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

Ответы [ 18 ]

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

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

41 голосов
/ 18 апреля 2011

null - это null. false - это false. Грустно, но верно.

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

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

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)
14 голосов
/ 23 октября 2015

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4 голосов
/ 22 декабря 2014

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

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

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

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

  • логическое значение 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.

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

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

Я думаю, что плохие разработчики находят в коде различные варианты использования 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 как первого типа класса в языке - это нормально, и я думаю, что Джоэл говорил об этом в своем недавнем посткасте. Но старайтесь не использовать смешивание и сопоставление bools с вашими данными в ваших подпрограммах, и все будет в порядке.

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

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

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

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

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

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

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

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

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

...