如果我在PHP中设置$var
为a string
,那么该变量将true
在任何条件下评估:
$var = "foo"; if ( $var ) { echo 'I will be printed'; } else { echo 'I will not be printed'; }
我明白我上面的条件会自动输入类型,以便$var
转换为bool
.
现在,如果我投$var
了一个integer
,我得到0
:
var_dump( (int)$var ); // int(0)
0
是一个虚假值,false
当转换为bool
:
$zero = 0; var_dump( (bool)$zero ); // bool(false)
考虑到上述情况,为什么我的条件不打印"我不会被打印"?
类型杂耍不是无损的.它带来了潜在的数据丢失.
例如...
var_dump( strval(intval("foo"))); // string(1) "0"
但如果你要写......
if( "foo" == "0") // non-strict comparison intended
你肯定不会指望它运行!事实上并非如此.
因此,因为类型更改伴随着数据丢失,所以您不能指望转换是等效的.换句话说,boolval(intval($var))
并且boolval($var)
不必相同.
如果你想要比较严格,请使用以下内容:
if( is_string($var) && $var !== "") // is not the empty string
(可以说!==
是多余的,!=
工作正常,但可以说这整个条件都是矫枉过正)