В 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 function is_null () вместе с оператором ===
. !==
также работает так, как вы ожидали.
Чтобы определить как 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... }