PHP认为null等于零

Ste*_*ven 54 php null

在php中,($myvariable==0) 当$ myvariable为零时,表达式的值为true; 当$ myvariable为null时,此表达式的值也为true.如何排除第二种情况?我的意思是我希望只有当$ myvariable为零时表达式才为真.我当然可以写

($myvariable!=null && $myvariable==0 )
Run Code Online (Sandbox Code Playgroud)

但还有其他优雅的方法吗?

Sil*_*ost 86

$myvariable === 0
Run Code Online (Sandbox Code Playgroud)

阅读更多关于比较运算.

  • 除非$ myvariable是浮点数,否则$ myvariable === floatval(0) (2认同)

Ric*_*ard 12

你暗示了一个深刻的问题:什么时候表达式应该是真的?

下面,我将解释为什么你在做什么不工作以及如何解决它.

在许多语言中null,0和空字符串("")都计算为假,这可以使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
Run Code Online (Sandbox Code Playgroud)

所以你要比较一个零和一个数字.因此,null和数字都转换为boolean.本页面告诉我们,在这样的转换都null0被认为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.
Run Code Online (Sandbox Code Playgroud)

第一个比较器是您现在使用的比较.请注意,它执行我之前提到的转换.

使用第二个比较器将解决您的问题.由于null和数字的类型不同,因此===比较将返回false,而不是像==运算符那样执行类型转换.

希望这可以帮助.


Pao*_* Im 6

通过以下方式识别为零或零:

  • is_int($var)如果变量是数字或数字字符串.要识别零,使用is_numeric($var)也是解决方案或使用$var === 0

  • is_null($var) 如果变量为NULL


Ski*_*ick 5

尝试($myvariable === 0)哪个不会执行类型强制。