我对我刚刚处理的脚本遇到的问题感到困惑。我有以下内容:
function getPart($part)
{
$array = array('a', 'b', 'c');
if ($part == 'first') $part = 0;
if ($part == 'last') $part = count($array) - 1;
if (isset($array[$part])) return $array[$part];
return false;
}
$position = 0;
echo getPart($position);
所以,如果我要尝试字符串“first”,我应该输出“a”作为输出。使用字符串“last”,我应该得到“c”,依此类推。当我运行上面的脚本时,使用PHP 5.3,我得到“c”......
困惑,我跑了一个快速测试...
var_dump(0 == 'first');
var_dump(0 == 'last');
两者都返回TRUE
... 为什么??? 我对此行为感到困惑!
答案 0 :(得分:6)
如果您尝试将字符串与数字进行比较,PHP将尝试将字符串转换为数字。在这种情况下,它无法这样做,因为PHP无法将“first”或“last”转换为数字,因此它只是将其转换为零。这使得检查0 == 0
,这当然是真的。如果您希望PHP不尝试转换任何内容,请使用标识运算符===
(因此,两个操作数必须具有相同的值且属于同一类型)。
答案 1 :(得分:3)
结帐(int) 'first'
。这基本上是PHP对右手操作数的作用。
当不在两个不同类型的操作数之间使用严格相等比较运算符(===
)时,PHP将强制转换操作数类型。
答案 2 :(得分:1)
PHP是弱类型的。正在发生的事情是它试图将"first"
转换为数字。它失败了,并返回零。它现在有两个数字:零和零。要使其不尝试转换类型,请使用===
而不是==
。
答案 3 :(得分:-1)
PHP有点奇怪,因为它将数字比较中的字符串视为0.您可以通过引用变量来强制进行字符串比较:
function getPart($part)
{
$array = array('a', 'b', 'c');
if ("$part" == 'first') $part = 0;
if ("$part" == 'last') $part = count($array) - 1;
if (isset($array[$part])) return $array[$part];
return false;
}