如果我在PHP中将$var
设置为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
是 falsy 值,转换为false
时会变为bool
:
$zero = 0;
var_dump( (bool)$zero ); // bool(false)
考虑到上述情况,为什么我的条件不打印"我不打印"?
答案 0 :(得分:5)
类型杂耍不是无损的。它可能会导致数据丢失。
例如......
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
(可以说!==
是多余的,!=
工作正常,但可以说这整个条件都有点过分了)
答案 1 :(得分:1)
以下是对事实的简单测试:
$s = array( // bool (int)cast
'', // FALSE int=0
'Test', // TRUE int=0
'0.0', // TRUE int=0
'124', // TRUE int=124
'000', // TRUE int=0
'0', // FALSE int=0
NULL // FALSE int=0
);
foreach( $s as $var )
echo $var . ' // '
. ( $var ? 'TRUE' : 'FALSE' ) . ' '
. 'int=' . (int)$var . PHP_EOL;
如果将字符串转换为bool,FALSE
为空字符串,NULL且值为“0”。其他一切都是TRUE
。请参阅false上的手册。
在你的情况下,$var
是一个字符串“foo”,它没有被转换为FALSE
,因为它既不是NULL,也不是“0”或“”,因此你不会得到'我将不会被打印出来。
如果将其强制转换为INT,除纯数值外,一切都为0。
答案 2 :(得分:0)
你不会完成else
回显,因为在if中使用非空的字符串时评估为true,即:
$foo = "Hello";
if ($foo)
print "True"; //This will print as a string is true if not empty
else
print "False"; //Doesn't print as string is not empty
试试这个:
$foo = "Hello";
if ((int)$foo)
print "True";
else
print "False"; //Will print as the string evaluates to 0 (false) as it is not an integer