php разница между!$a и $a === false

Возможный дубликат:
Является ли!$ Page == false или $page в php?

В чем разница между этими двумя типами проверок? И каков будет правильный способ проверки типов, называемый функциями или методами, которые дают сбой и возвращают false?

if (!is_dir($path)) {...}

или же

if (is_dir($path) === false) {...}

4 ответа

(!is_dir($path)){...}

IF is_dir($path) РАВНО для ложного.

(is_dir($path) === false){...}

IF is_dir($path) имеет значение IDENTIFCAL для false. Это более явно в том смысле, что результат is_dir ($ path) ДОЛЖЕН быть логическим значением FALSE. Больше ничего не подойдет.

Запустите этот пример:

<?php

$var = 0;

if($var == false){
    echo 'Var is EQUAL to FALSE.';
}

if($var === false){
    echo 'Var is IDENTICAL to FALSE.';
}

?>

Читайте об операторах сравнения здесь.

!$a будет истинным, если $ a установлено в 0, или если $ a не установлено. Тройной знак равенства строго проверяет ложь, а не только значения с нулевым значением.

Я думаю, что это будет легче понять, приведя несколько примеров (вам нужно выполнить команды php в командной строке / терминале)! не является логическим оператором и определяется в документации php как "!$a имеет РЕЗУЛЬТАТ TRUE, если $ a не TRUE."

php -r "$a=NULL; $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a=''; $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a=array(); $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a=false; $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a=0; $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a=0.0; $b = !$a; var_dump($b);"

возвращает bool (true)

php -r "$a='0'; $b = !$a; var_dump($b);"

возвращает bool (true)

Хотя $a === false будет иметь значение true, только если $ a является actall bollean, а его значение равно false (все остальные распространенные примеры будут ложными с оператором!)

php -r "$a=false; $b = $a === false; var_dump($b);"

возвращает bool (true)

В вашем примере просто используйте не оператор! потому что вам не нужно проверять тип результата is_dir.

=== оператор сравнения "то же значение и тот же тип". Так $foo === false верно только если $foo уже bool тип равен false, тогда как !$foo будет выполнять различные операции в зависимости от типа $foo (например, если $foo является объектом или ресурсом, тогда он проверит, является ли это нулевым значением. Если это строка, тогда она проверяет наличие нуля (и я думаю, что пустая строка тоже, но я не уверен в этом). Если это целое число, то проверяется, равно ли оно нулю или нет. В основном это работает аналогично C ! оператор, прежде чем они добавили тип bool (где логические значения были действительно int ценности).

В вашем коде оба примера являются "правильными", хотя первый пример, использующий ! оператор, является наиболее кратким и должен быть предпочтительным.

Другие вопросы по тегам