是php switch语句错误吗?

时间:2011-11-16 03:48:00

标签: php

我有一个问题想知道答案, 为什么以下代码将打印A不是默认值?

$i = 0;
switch ($i) {
    case 'A':
        echo "i equals A"; //will printed it
        break;
    case 'B':
        echo "i equals B";
        break;
    case 'C':
        echo "i equals C";
        break;
    default:
       echo "i equals other";
}

任何人都可以告诉我为什么?我真的不明白。 我的PHP版本是5.2.17 Theanks。

5 个答案:

答案 0 :(得分:10)

这种比较正在发生:

0 == 'A'

PHP会将字符串转换为整数。这导致字母A变为零,因为它不代表数字。

因此:

0 == 0

这种情况符合开关,因此被执行。非常反直觉,但这是PHP的类型系统的工作方式,不幸的是在技术上不是一个错误。

您可以通过将$i转换为如下字符串来解决此问题:

switch ((string) $i) {

如果可以的话,只需将其初始化为字符串:

$i = '0';

答案 1 :(得分:2)

发生的事情是(int)0等于(string)A。

尝试将$i = 0;更改为$i = '0';,它应该可以正常运行。

答案 2 :(得分:1)

$ i是一个整数,你要比较一个字符串。 PHP会将该字符串('A')强制转换为整数,这实际上也是0,所以是的...在PHP-land中,'A' == 0为TRUE。

答案 3 :(得分:0)

尝试:

<?php
$i = 0;
if ($i == 'A')
{
    echo 'woo';
}

并访问此href:http://php.net/manual/en/control-structures.if.php

答案 4 :(得分:0)

这应该可以。你应该转换为字符串,因为案例中有switch case;

<?
$i = 0;
$i = (string)$i;
switch ($i) {
    case 'A':
        echo "i equals A"; //will printed it
        break;
    case 'B':
        echo "i equals B";
        break;
    case 'C':
        echo "i equals C";
        break;
    default:
       echo "i equals other";
}

?>