2012-03-05 199 views
4

switch语句这是我的示例代码:问题与PHP

<?php 

$t = 0; 

switch($t) 
{ 
    case 'add': 
     echo 'add'; 
     break; 
    default: 
     echo 'default'; 
     break; 
} 

echo "<br/>"; 

echo system('php --version'); 

这是输出(codepad.org测试 - 结果是一样的):

add 
PHP 5.3.6-13ubuntu3.6 with Suhosin-Patch (cli) (built: Feb 11 2012 03:26:01) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies 

什么是错在这里?

+0

大问题。 – jere 2012-03-05 13:49:06

+0

我知道,它看起来很愚蠢,但这种情况发生在我的ZF应用程序中。那$ t变量实际上是$ this-> id属性,它的参数来自$ _REQUEST数组(来自url)。这在我的情况下总是字符串,现在我知道,如果需要参数错过了,而不是将其设置为一个空字符串它将此属性设置为一个整数(0).. – 2012-03-05 13:56:51

+1

它不是讽刺!我真的想说这是一个很好的问题:) – jere 2012-03-05 14:08:29

回答

7

您的变量$t具有整数值0。通过switch声明,您告诉PHP首先将它与值'add'(一个字符串)进行比较。 PHP does this by converting'add'为一个整数,并且由于the rules of the conversion结果证明是0

因此,采取了第一个分支 - 这可能是令人惊讶的,但它也是预期的。

你会看到预期的行为,如果你没有

$t = "0"; 

现在,无论$t'add'都是字符串,所以没有神奇的转换正在进行,当然他们比较不等。

+0

谢谢!是的,强制一个值是字符串解决了问题! – 2012-03-05 13:49:12

2

那是因为你是用字符串..如果你逼的“添加”转换为int这将是0比较一个int ..“修理”你的switch语句可以更换

switch($t) 

switch($t . '') 

这样告诉服务器他应使用T的字符串值(或任何其他方式来实现这一目标)