2011-08-13 133 views
0

下面的代码我得到一个页面,打印任务,然后退出,即使任务的值为零。非常不寻常的PHP行为

$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;  

它会正常工作,那么,为什么它是一个字符串值“删除'等于0?

+6

我会尽我所能避免嵌套三元组,因为这会造成混淆,很难直观理解。 –

+0

是的,这样的语句应该放在大括号中,即使只有一个短语,例如:echo''

' . $i > 0 ? $i : 1 . '
';'没有括号就会失败。 ''
' . ($i > 0 ? $i : 1) . '
';' – Rolice

+0

使用$ _REQUEST'task']会不会更简单? – symcbean

回答

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警告。

11

任何不能转换为数字的字符串都会自动转换为0;所以与数字相比,“删除”是0。

你可以比较使用的身份运营商咨询是否类型以及

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

这将确保类型检查,结果返回false。