PHP:理解字符串类型杂耍

时间:2015-12-02 13:47:33

标签: php casting

如果我在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)

考虑到上述情况,为什么我的条件不打印"我不打印"?

3 个答案:

答案 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