PHP的变量类型宽大

Chr*_*isW 5 php

关于PHP的in_array()帮助页面(http://uk.php.net/manual/en/function.in-array.php#106319)的最新评论指出,由于PHP"对变量类型的宽容",会出现一些不寻常的结果,但没有解释为什么会出现这些结果.特别是,我不遵循为什么会发生这种情况:

// Example array

$array = array(
    'egg' => true,
    'cheese' => false,
    'hair' => 765,
    'goblins' => null,
    'ogres' => 'no ogres allowed in this array'
);

// Loose checking (this is the default, i.e. 3rd argument is false), return values are in comments
in_array(763, $array); // true
in_array('hhh', $array); // true
Run Code Online (Sandbox Code Playgroud)

或者为什么海报认为以下是奇怪的行为

in_array('egg', $array); // true
in_array(array(), $array); // true
Run Code Online (Sandbox Code Playgroud)

(当然'egg'确实出现在数组中,PHP并不关心它是一个键还是一个值,并且有一个数组,并且PHP不关心它是否为空?)

任何人都可以提供任何指示..?

Mat*_*lin 5

763 == true,因为true等于不为0,NULL或''的任何东西,对于数组来说也是一样,因为它是一个值(不是对象)。

为了避免这个问题,您应该将第三个参数传递为TRUE来表示STRICT,因此is_rray将执行===这是一个类型相等的操作,因此

第763章

而且array()!== true也不会


Mar*_*c B 2

在内部,您可以认为基本的 in_array() 调用的工作方式如下:

function in_array($needle, $haystack, $strict = FALSE) {
    foreach ($haystack as $key => $value) {
        if ($strict === FALSE) {
            if ($value == $needle) {
                return($key);
            }
        } else {
            if ($value === $needle) {
                return($key);
        }
    }
    return(FALSE);
}
Run Code Online (Sandbox Code Playgroud)

请注意,它使用比较运算符==- 该运算符允许类型转换。因此,如果您的数组包含一个简单的布尔TRUE值,那么基本上您使用 in_array 搜索的所有内容都会被找到,并且除了 PHP 中的以下内容之外的几乎所有内容都可以被类型转换为 true:

'' == TRUE // false
0 == TRUE // false
FALSE == TRUE // false
array() == TRUE // false
'0' == TRUE // false
Run Code Online (Sandbox Code Playgroud)

但:

'a' == TRUE // true
1 == TRUE // true
'1' == TRUE // true
3.1415926 = TRUE // true
etc...
Run Code Online (Sandbox Code Playgroud)

这就是为什么 in_array 有可选的第三个参数来强制进行严格比较。它只是让 in_array 进行===严格比较,而不是==.

意思就是

'a' === TRUE // FALSE
Run Code Online (Sandbox Code Playgroud)