使用字符串时PHP比较中断

Oma*_*mar 1 php variables string-comparison

我对比较"错误"感到困惑.我编码这种比较的方式,我想确保如果用户输入 0或1 之外的任何值(或没有值),结果应为0:

session_start();
function test( $status = 0 ) {
        if( !isset($_SESSION['status']) ) { $_SESSION['status'] = 0; }
        else {
            switch( $status ) {
                case 0: $_SESSION['status'] = $status;
                break;

                case 1: $_SESSION['status'] = $status;
                break;

                default:
                $_SESSION['status'] = 0; 
                $status = 0;
            }
        }
        echo 'Variable value: ' . $status;
        echo ' | Session value: ' . $_SESSION['status'] . "<br/>";
}
test();
test(0);
test(1);
test(999);
test('ready');
Run Code Online (Sandbox Code Playgroud)

然而,它打破在test('ready');,因为它输出Variable value: ready | Session value: ready,而不是Variable value: 0 | Session value: 0.case o:即使将数字与字符串进行比较,它也应该继续运行良好(并且继续).

顺便说一下:即使我换switch了,结果也一样if( $status ===

===编辑:12/19/2012 ===
感谢@ bryan-b@jatochnietdan评论和回答:-Because a string (when compaired with numbers [if(0 =='string')] ) is compared as 0

这帮助我弄清楚了问题,并了解到,与其他语言不同,它不是在比较中自动返回false,因为它们具有不同的数据类型 ; php将字符串变量与数字进行比较时的值进行比较.这有点值得关注.

这是更正(工作)的代码:

session_start();
function test( $status = 0 ) {
        if( !isset($_SESSION['status']) ) { $_SESSION['status'] = 0; }
        else {
            switch( $status ) {
                case 1: $_SESSION['status'] = $status;
                break;

                default:
                $_SESSION['status'] = 0; 
                $status = 0;
            }
        }
        echo 'Variable value: ' . $status;
        echo ' | Session value: ' . $_SESSION['status'] . "<br/>";
}
test();
test(0);
test(1);
test(999);
test('ready');
Run Code Online (Sandbox Code Playgroud)

谢谢@ bryan-b@jatochnietdan!

PS.我希望我能投2个答案.

JaT*_*Dan 5

如果您真正想要的是$ _SESSION ['status']的值为0,如果输入的不是1,那么这应该足够了:

function test( $status = 0 ) {
    $_SESSION['status'] = ($status == 1 ? 1 : 0);
}
Run Code Online (Sandbox Code Playgroud)

通过测试,值如下:

Session value: 0
Session value: 0
Session value: 1
Session value: 0
Session value: 0
Run Code Online (Sandbox Code Playgroud)

编辑:修正了一个轻微的错误,它默认为1,但我相信你希望它默认为0.

至于你的代码,它是"准备好"的原因是因为你在案例0中将$ _SESSION ['status']设置为$ status而在该实例中$ status包含"ready".您可以通过简单地执行$ _SESSION ['status'] = 0来解决这个问题.

  • 不应该是`$ status === 0`? (2认同)