登录

php - switch难道不是这样的写的吗? ssid去哪了?

在别的群看到这个问题
ssid去哪了?

# PHP
伊谢尔伦伊谢尔伦2198 天前520 次浏览

全部回复(4) 我要回复

  • ringa_lee

    ringa_lee2017-04-11 09:57:56

    我们可以在一些地方进行 echo 输出变量,如以下代码所示。

    <?php
    $filed = array(0, 707, 708, 'ssid');
    $dd = array();
    
    foreach ($filed as $value) {
        echo $value . "\n";
        switch ($value) {
            case 0:
                $filedStr = 'sindex';
            break;
            case 707:
                $filedStr = 'login';
            break;
            case 708:
                $filedStr = 'register';
            break;
            case 'ssid':
                $filedStr = 'ssid';
                echo $filedStr;
            break;
            
            default:
            break;
        }
    }

    在结果中,我们可以发现,echo $filedStr;这步并没有输出。

    这个时候,就应该看PHP官方文档里,为什么会导致这样,原因就出于 switch。

    在PHP官方文档,什么,这是英文的,当然也有中文的。里面有句话:

    Attention if you have mixed types of value in one switch statemet it can make you some trouble

    当然底下给出了一种方案:

    <?php
    
    $string="2string";
    
    switch($string)
    {
        case (string) 1:
            echo "this is 1";
            break;
        case (string) 2:
            echo "this is 2";
            break;
        case '2string':
            echo "this is a string";
            break;
    }
    
    ?>

    里面提到了 PHP 用了动态类型转换,也就是这篇博客里讲的。

    动态语言的变量类型是随存储的变量而变化的,即变量类型是根据具体环境而进行变化的。

    当 $value 值为 'ssid' 时,执行到 case 0 的时候,要转换为整形和其做比较,因为转换之后相等,所以匹配不到后面的 'ssid' 。

    回复
    0
  • 怪我咯

    怪我咯2017-04-11 09:57:56

    因为你的switch匹配里, case是整数, 这会导致在匹配的时候把字符串强制转换为integer, ssid转为int为0, 是不会匹配到case 'ssid'

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-11 09:57:56

    ssid肯定没有匹配到

    回复
    0
  • 怪我咯

    怪我咯2017-04-11 09:57:56

    谢谢大家的回答,已经懂了.

    // 只取出以合法数字开始整型和浮点型,取到第一个非法数字截止...
    intval('1234ssid');// 1234
    intval('ssid');// 0
    var_dump('ssid' == 0);//so, 这里就为`true`,就会执行它所对应的代码段.ssid想再去匹配已经没有机会了哈
    

    回复
    0
  • 取消回复发送