PHP认为null等于零
在php中, ($myvariable==0)
当$ myvariable为零时,expression式的值为true; 当$ myvariable为null时,这个expression式的值也是真的。 我怎样才能排除第二种情况? 我的意思是我希望expression式只有当$ myvariable为零时才是真的。 我当然可以写
($myvariable!=null && $myvariable==0 )
但有没有其他优雅的方式来做到这一点?
$myvariable === 0
阅读更多关于比较运算符 。
你暗示了一个深刻的问题:expression何时应该是真的?
下面,我将解释为什么你在做什么不工作,以及如何解决它。
在许多语言中, null
, 0
和空string( ""
)都计算为false,这可以使if
语句非常简洁和直观,但是null
, 0
和""
也都是不同的types。 他们应该如何比较?
这个页面告诉我们,如果我们有两个variables进行比较,那么variables如下转换(在第一个匹配时退出表格)
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和数字都被转换为布尔值。 这个页面告诉我们,在这种转换中, 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.
第一个比较是你现在使用的比较。 请注意,它执行我前面提到的转换。
使用第二个比较器将解决您的问题。 由于null和数字不是相同的types,所以===
比较将返回false,而不是像==
运算符那样执行types转换。
希望这可以帮助。
使用php函数is_null()函数和===
运算符。 !==
也按照您期望的方式工作。
通过以下方式识别为空或零:
-
is_int($var)
如果variables是数字或数字string。 要识别零,使用is_numeric($var)
也是解决scheme或使用$var === 0
-
is_null($var)
如果variables是NULL
尝试($myvariable === 0)
这将不会执行types的强制。
第二个解决scheme也不行。 ===
运算符是解决您的问题的方法。
$myvariable===0 $a === $b
相同如果$ a等于$ b,则它们是相同的types
有一个is_null
函数,但是这只会replace你的$myvariable!=null
如果你的零可能是一个string,你也应该考虑检查“零串”
($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... }