2012-05-14 148 views
2

我有以下代码:PHP类型转换混乱

<?php 
    $val = 0; 
    $res = $val == 'true'; 

    var_dump($res); 
?> 

我始终是在印象中,$资源应该是“假”如上述表达式PHP将试图强制类型转换$ VAL到布尔类型(其中零将被转换为false)和一个字符串(非空字符串为true)。但如果我执行上面的代码输出将是:

boolean true 

我错过了什么?谢谢。

+0

字符串 '真' 可能混淆了一点,这里是另一个例子: '' Still $ res - > true。 – user1393876

回答

3

在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为字符串),所以使用严格比较很有价值。

+0

谢谢,这很明显,用===运算符的结果将是FALSE,但0是int,我可以事件类型将其转换为'$ res =(int)$ val ==(string)'true';'和结果仍然是TRUE。 – user1393876

+0

@ user1393876没错。做'intval('true')'看看你得到了什么...... –

+0

对不起,我又增加了一个例子来让我的问题更清楚。我并不是说右边的操作数应该是'true',它可以是任何字符串,当PHP将字符串与整数0(零)进行比较时,结果为:true。 – user1393876

0

因为$val是第一个操作符PHP将字符串true转换为一个整数变成0.结果为0 == 0并且结果为true;

+0

感谢您的回应,所以来自您的逻辑,解释器会将第二个操作数的类型转换为第一个操作数的类型,对不对? 但是,如果我改变操作数的结果仍然是这样的: '<?php $ val = 0; $ res ='xxxxxx'== $ val; var_dump($ res); ?> – user1393876

0

试试这个

<?php 
    $val = 1; 
    $res = (bool)$val == 'true'; 

    var_dump($res); 
?>