我有以下代码:PHP类型转换混乱
<?php
$val = 0;
$res = $val == 'true';
var_dump($res);
?>
我始终是在印象中,$资源应该是“假”如上述表达式PHP将试图强制类型转换$ VAL到布尔类型(其中零将被转换为false)和一个字符串(非空字符串为true)。但如果我执行上面的代码输出将是:
boolean true
我错过了什么?谢谢。
我有以下代码:PHP类型转换混乱
<?php
$val = 0;
$res = $val == 'true';
var_dump($res);
?>
我始终是在印象中,$资源应该是“假”如上述表达式PHP将试图强制类型转换$ VAL到布尔类型(其中零将被转换为false)和一个字符串(非空字符串为true)。但如果我执行上面的代码输出将是:
boolean true
我错过了什么?谢谢。
在PHP中,所有非空的非数字字符串评估为零,因此0 == 'true'
为TRUE,但0 === 'true'
为FALSE。字符串true
尚未转换为布尔值,但将与字符串进行比较为零。零作为int值保留,而不是作为布尔值强制转换。所以,最后你得到:
// string 'true' casts to int 0
0 == 0 // true
试试这个:
echo intval('true');
// 0
echo intval('some arbitrary non-numeric string');
// 0
评论the PHP type comparisons table。一般来说,在PHP中进行布尔比较时,类型不相同(在这种情况下,int为字符串),所以使用严格比较很有价值。
谢谢,这很明显,用===运算符的结果将是FALSE,但0是int,我可以事件类型将其转换为'$ res =(int)$ val ==(string)'true';'和结果仍然是TRUE。 – user1393876
@ user1393876没错。做'intval('true')'看看你得到了什么...... –
对不起,我又增加了一个例子来让我的问题更清楚。我并不是说右边的操作数应该是'true',它可以是任何字符串,当PHP将字符串与整数0(零)进行比较时,结果为:true。 – user1393876
因为$val
是第一个操作符PHP将字符串true
转换为一个整数变成0.结果为0 == 0并且结果为true;
感谢您的回应,所以来自您的逻辑,解释器会将第二个操作数的类型转换为第一个操作数的类型,对不对? 但是,如果我改变操作数的结果仍然是这样的: '<?php $ val = 0; $ res ='xxxxxx'== $ val; var_dump($ res); ?> – user1393876
试试这个
<?php
$val = 1;
$res = (bool)$val == 'true';
var_dump($res);
?>
字符串 '真' 可能混淆了一点,这里是另一个例子: '' Still $ res - > true。 –
user1393876