非常不寻常的PHP行为

时间:2011-08-13 18:10:26

标签: php loose-typing

对于下面的代码,我得到一个打印任务的页面,然后退出,即使任务的值为零。

$task = (isset($_POST['task']))?$_POST['task'] :(isset($_GET['task']))?$_GET['task']:0; 
if($task == "delete") {
    echo $task;
    exit(); 
}

输出:

0

但是,如果我将第一行更改为:

$task = (isset($_POST['task'])) ? $_POST['task'] :(isset($_GET['task'])) ? $_GET['task'] : NULL;    

它会正常工作,为什么字符串'delete'的值等于0?

2 个答案:

答案 0 :(得分:11)

任何无法转换为数字的字符串都会自动转换为0;因此,与数字比较时,“删除”为0。

您可以使用身份运算符进行比较以及检查类型

if($task === "delete") {
    echo $task;
    exit(); 
}

这将确保检查类型并因此返回false。

答案 1 :(得分:2)

您的三元运算符中没有括号,请参阅operator precedence

中的示例
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

你的例子:

$task =
  (
    (isset($_POST['task']))
    ? $_POST['task']
    : (isset($_GET['task']))
  )
  ? $_GET['task']
  : 0;

因此,根据您的$_POST$_GET,您甚至可能会收到“无效索引”PHP警告。