搜尋

首頁  >  問答  >  主體

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

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

伊谢尔伦伊谢尔伦2906 天前739

全部回覆(4)我來回復

  • ringa_lee

    ringa_lee2017-04-11 09:57:56

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    <code><?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;

        }

    }</code>

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

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

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

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

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    <code><?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;

    }

     

    ?></code>

    里面提到了 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

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

    1

    2

    3

    4

    5

    <code>// 只取出以合法数字开始整型和浮点型,取到第一个非法数字截止...

    intval('1234ssid');// 1234

    intval('ssid');// 0

    var_dump('ssid' == 0);//so, 这里就为`true`,就会执行它所对应的代码段.ssid想再去匹配已经没有机会了哈

    </code>

    回覆
    0
  • 取消回覆