Ответ 1
$myvariable === 0
Узнайте больше о операторах сравнения.
В php, ($myvariable==0)
Когда $myvariable равно нулю, значение выражения истинно; когда $myvariable равно null, значение этого выражения также верно. Как я могу исключить второй случай? Я хочу сказать, что выражение должно быть истинным только тогда, когда $myvariable равно нулю. Конечно, я могу написать
($myvariable!=null && $myvariable==0 )
но есть ли другой элегантный способ сделать это?
$myvariable === 0
Узнайте больше о операторах сравнения.
Вы намекаете на глубокий вопрос: когда должно быть истинное выражение?
Ниже я объясню, почему то, что вы делаете, не работает и как его исправить.
Во многих языках 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, а не выполняет преобразование типа в качестве оператора ==
.
Надеюсь, что это поможет.
Используйте функцию php is_null() вместе с оператором ===
. !==
также работает так, как вы ожидали.
Чтобы идентифицировать нуль или ноль с помощью:
is_int($var)
, если переменная является числом или числовой строкой. Чтобы определить нуль, используйте is_numeric($var)
также решение или используйте $var === 0
is_null($var)
, если переменная имеет значение NULL
Попробуйте ($myvariable === 0)
, который не будет выполнять принуждение типа.
Второе решение тоже не сработает. Оператор ===
является решением вашей проблемы.
$myvariable===0
$a === $b
Идентичный ИСТИНА, если $a равно $b, и они одного типа
Здесь функция is_null
, но это просто заменит ваш $myvariable!=null
Если ваш ноль может быть строкой, вы также должны проверить "нулевую строку"
($myvariable === 0 || $myvariable === '0')
Я столкнулся с аналогичной проблемой в одном из моих проектов, с небольшой разницей, что я также использовал значения ZERO в качестве допустимого значения для моего условия. здесь, как я решил это, используя простую логику, чтобы отделить NULL от нуля и других значений.
if (gettype($company_id) === 'NULL') {
$company = Company::where('id', Auth::user()->company_id)->first();
} else {
$company = Company::where('id', $company_id)->first();
}
В моем случае я нашел эту душу, и она работает для меня:
if ($myvariable == NULL) {
codehere...
}