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

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

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

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

Solutions Collecting From Web of "PHP считает, что нуль равен нулю"

 $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... }