Подтвердить что ты не робот

PHP считает, что нуль равен нулю

В php, ($myvariable==0) Когда $myvariable равно нулю, значение выражения истинно; когда $myvariable равно null, значение этого выражения также верно. Как я могу исключить второй случай? Я хочу сказать, что выражение должно быть истинным только тогда, когда $myvariable равно нулю. Конечно, я могу написать

($myvariable!=null && $myvariable==0 )

но есть ли другой элегантный способ сделать это?

4b9b3361

Ответ 2

Вы намекаете на глубокий вопрос: когда должно быть истинное выражение?

Ниже я объясню, почему то, что вы делаете, не работает и как его исправить.

Во многих языках null, 0, а пустая строка ("") оценивается как false, это может сделать инструкции if довольно краткими и интуитивными, но null, 0 и "" также являются разными. Как их следует сравнивать?

Эта страница говорит нам, что если мы сравниваем две переменные, то переменные преобразуются следующим образом (выход из таблицы в первом совпадении )

Type of First  Type of Second   Then
null/string    string           Convert NULL to "", numerical/lexical comparison
bool/null      anything         Convert to bool, FALSE < TRUE

Итак, вы сравниваете число null и число. Следовательно, и нуль, и число преобразуются в логическое. Эта страница сообщает нам, что в таком преобразовании считаются null и 0 FALSE.

Ваше выражение теперь читает, false==false, что, конечно, верно.

Но не то, что вы хотите.

Эта страница содержит список операторов сравнения PHP.

Example   Name                Result
$a ==  $b  Equal              TRUE if $a equals $b after type juggling.
$a === $b  Identical          TRUE if $a equals $b, AND they are of the same type.
$a !=  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a <>  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a !== $b  Not identical      TRUE if $a not equals $b, or they are not of the same type.
$a  <  $b  Less than          TRUE if $a is strictly less than $b.
$a  >  $b  Greater than       TRUE if $a is strictly greater than $b.
$a <=  $b  Less than/equal    TRUE if $a is less than or equal to $b.
$a >=  $b  Greater than/equal TRUE if $a is greater than or equal to $b.

Первый компаратор - это сравнение, которое вы используете сейчас. Обратите внимание, что он выполняет упомянутые выше преобразования.

Использование второго компаратора устранит вашу проблему. Так как нуль и число не одного типа, сравнение === возвращает false, а не выполняет преобразование типа в качестве оператора ==.

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

Ответ 3

Используйте функцию php is_null() вместе с оператором ===. !== также работает так, как вы ожидали.

Ответ 4

Чтобы идентифицировать нуль или ноль с помощью:

  • is_int($var), если переменная является числом или числовой строкой. Чтобы определить нуль, используйте is_numeric($var) также решение или используйте $var === 0

  • is_null($var), если переменная имеет значение NULL

Ответ 5

Попробуйте ($myvariable === 0), который не будет выполнять принуждение типа.

Ответ 6

Второе решение тоже не сработает. Оператор === является решением вашей проблемы.

Ответ 7

$myvariable===0


$a === $b 

Идентичный ИСТИНА, если $a равно $b, и они одного типа

Ответ 8

Здесь функция is_null, но это просто заменит ваш $myvariable!=null

Ответ 9

Если ваш ноль может быть строкой, вы также должны проверить "нулевую строку"

($myvariable === 0 || $myvariable === '0')

Ответ 10

Я столкнулся с аналогичной проблемой в одном из моих проектов, с небольшой разницей, что я также использовал значения ZERO в качестве допустимого значения для моего условия. здесь, как я решил это, используя простую логику, чтобы отделить NULL от нуля и других значений.

    if (gettype($company_id) === 'NULL') {
        $company = Company::where('id', Auth::user()->company_id)->first();
    } else {
        $company = Company::where('id', $company_id)->first();
    }

Ответ 11

В моем случае я нашел эту душу, и она работает для меня:

if ($myvariable == NULL) {
    codehere...
}