是php开关语句错误


Is php switch statement bug?

我有个问题想知道答案,为什么以下代码将打印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.17Theanks。

正在进行此比较:

0 == 'A'

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

因此:

0 == 0

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

你可以通过把$i变成这样的字符串来解决这个问题:

switch ((string) $i) {

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

$i = '0';

实际情况是(int(0等于(string(A。

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

$i是一个整数,您将其与字符串进行比较。PHP会将该字符串('A'(类型转换为一个整数,这使得它实际上也是0,所以是的。。。在PHP领域,'A' == 0为TRUE。

try:

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

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

这应该可以工作。您应该将in转换为字符串,就像在case中切换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";
}
?>