【问题标题】:How to simplify this php switch statement?如何简化这个 php switch 语句?
【发布时间】:2010-03-16 16:02:33
【问题描述】:

我想改变这个:

// use appropiate lang.xx.php file according to the value of the $lang
switch ($_SESSION['lang']) {
case 'en':
 $lang_file = 'lang.en.php';
 break;

case 'es':
 $lang_file = 'lang.es.php';
 break;

case 'zh-tw':
 $lang_file = 'lang.zh-tw.php';
 break;

case 'zh-cn':
 $lang_file = 'lang.zh-cn.php';
 break;

default:
 $lang_file = 'lang.en.php';
}

变成这样的:

//include file for final output
 include_once 'languages/lang.'.$_SESSION['lang'].'php;

(我认为如果我执行上面的 include-final-output-thing,$lang_file 变量就会变得多余)

这样我就可以跳过整个switch 部分。我尝试了其他组合,但它们似乎不起作用。有什么建议吗?

【问题讨论】:

    标签: php switch-statement


    【解决方案1】:

    你可以这样做:

    switch ($_SESSION['lang']) {
    case 'en':
    case 'es':
    case 'zh-tw':
    case 'zh-cn':
        $lang_file = 'lang.'.$_SESSION['lang'].'.php';
        break;
    
    default:
        $lang_file = 'lang.en.php';
    }
    

    或者你用一个数组,用in_array看值是否在数组中:

    $languages = array('en', 'es', 'zh-tw', 'zh-cn');
    if (in_array($_SESSION['lang'], $languages)) {
        $lang_file = 'lang.'.$_SESSION['lang'].'.php';
    } else {
        $lang_file = 'lang.en.php';
    }
    

    您甚至可以在这两种情况下省略 en,因为它是默认值。

    【讨论】:

    • @Gumbo 很好的答案。但我有一个问题:有没有什么方法可以直接包含文件而不使用 $lang_file 变量这样的不确定:include_once 'languages/lang.'.$_SESSION['lang'].'php;
    • @janoChen:可以这样做。但是您应该考虑$_SESSION['lang'] 未设置或不包含有效值的情况。然后你会得到languages/lang..php。但是,如果您确保 $_SESSION['lang'] 始终存在并且具有有效值,那么您肯定可以这样做。
    【解决方案2】:
    $lang_file = 'lang.' . ($_SESSION['lang']) . 'php';
    if(!file_exists($lang_file))
    {
        $lang_file = 'lang.en.php';
    }
    

    虽然它对注射并不安全。但是,它允许您在不修改代码的情况下添加新的语言代码。

    【讨论】:

    • 我认为在 $_SESSION 变量中注入一些东西会很困难。客户端永远不会访问会话变量,它只是通过 cookie 连接到客户端。但是,$_COOKIE 变量可由客户端通过 HTTP 标头写入。
    【解决方案3】:

    或者:

    
    $allowed   = array('en', 'es', 'zh-tw', 'zh-cn');
    $lang_file = (in_array($_SESSION['lang'], $allowed))
               ? 'lang.'.$_SESSION['lang'].'.php' : 'lang.en.php';
    

    【讨论】:

      【解决方案4】:

      这会很好用

      $lang_file_tmp = 'lang.' . $_SESSION['lang'] . '.php';
      if ( preg_match( '/^[a-zA-Z\-]{2,5}$/', $_SERSSION['lang'] ) && file_exists( $lang_file_tmp ) ) { 
          $lang_file = $lang_file_tmp;
      } else {
          $lang_file = 'lang.en.php';
      }
      

      这样,您不必在每次添加新语言时都编辑代码,也不必担心安全问题。

      【讨论】:

      • 我可以看到您要执行的操作,但我认为您的代码不正确。你的 if 语句应该是if( preg_match(...) && file_exists(...) ) {。我也看不出$lang_file_tmp的意义
      • 你说得对,我已更改我的帖子以反映您的更改。 $lang_file_tmp 可以消除多次键入连接序列的需要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多