任何人都可以解释为什么它是真的
$a = Array('b' = > 'okokokok');
if ( isset( $a['b']['ok'] ) ) {
echo $a['b']['ok']; // Print 0
} else {
echo "else";
}
这是为了向后兼容 PHP 4(参见PHP Bug #29883)。将字符串转换为整数时,如果字符串不是有效整数,则变为 0(零)。打印字母“o”是因为它是字符串中偏移量 0 处的字符。
在 PHP 5.4 中,有意改变了行为(参见PHP Bug #60362);该 PHP 版本改为打印“else”。
首先,它不打印'0',而是小写'o'。尝试这个:
$string = 'abc';
echo $string['omgwhysuchkeyworks'];
它将打印'a'。这是因为在 PHP 中,当您在字符串变量上尝试任何键(数字除外)时,它似乎会返回字符串的第一个字符。这也是isset($a['b']['ok'])
返回 true 的原因。
这可能是PHP版本的问题。也许在较新的版本上它会按预期工作(它会写'else')
$a = Array('b' = > 'okokokok');
if ( isset( $a['b']['ok'] ) ) {
echo $a['b']['ok']; // Print 0
} else {
echo "else";
}
当你有一个字符串时,你可以把它当作数组。它的索引是数字的,从零开始到字符串长度减一。但是,如果您尝试将字符串作为索引传递(在这种情况下可以),PHP 会尝试将其转换为整数,并将其评估为零(intval('ok')
)。在使用 php 5.4 的系统上,它会以不同的方式处理并检查密钥本身并且不进行转换。因此,在一个系统中它可能会打印else
,而在另一个系统中它会打印o
。