将elses转换为具有布尔返回值的开关

时间:2015-04-27 10:11:59

标签: php switch-statement

我正在尝试将这个简单的else语句转换为更容易阅读的开关;

$parts_arr = explode('.', $_SERVER['SERVER_NAME']);

if (in_array('dev', $parts_arr)) {
    DEFINE('APP_ENV', "dev");
} else if (in_array('staging', $parts_arr)) {
    DEFINE('APP_ENV', "staging");
} else if (in_array('local', $parts_arr)) {
    DEFINE('APP_ENV', "local");
} else {
    DEFINE('APP_ENV', "live");
}

但是我已经完全画了一个空白。我不能使用foreach循环并使用字符串,因为APP_ENV无法重新定义。

4 个答案:

答案 0 :(得分:1)

您只能检查整个服务器名称。

switch($_SERVER['SERVER_NAME']) {
    case 'mysite.com':
    case 'www.mysite.com':
      DEFINE('APP_ENV', "live");
      break;
    case 'dev.mysite.com':
      DEFINE('APP_ENV', "dev");
      break;
    case 'staging.mysite.com':
      DEFINE('APP_ENV', "staging");
      break;
    case 'mylocalhost.local':
      DEFINE('APP_ENV', "local");
      break;
    default:
      exit;
}

答案 1 :(得分:0)

除非您正在进行字符串比较,否则您无法将其转换为开关案例结构。

也许是这样的:

$str = array_pop(explode('.', $_SERVER['SERVER_NAME']));

switch($str)
{
   case 'dev' :
      DEFINE('APP_ENV', "dev");
   break;
   // en so on
}

Sunil Pachlangia的解决方案不起作用,因为他正在比较一个数组和一个字符串

答案 2 :(得分:0)

<?php

$parts_arr = explode('.', $_SERVER['SERVER_NAME']);
switch (true) {
    case in_array('dev', $parts_arr):
        DEFINE('APP_ENV', "dev");
        break;
    case in_array('staging', $parts_arr):
        DEFINE('APP_ENV', "staging");
        break;
    case in_array('local', $parts_arr):
        DEFINE('APP_ENV', "local");
        break;
    default:
        DEFINE('APP_ENV', "live");
        break;
}

答案 3 :(得分:0)

我认为我倾向于回避拆分字符串和分析数组元素,因为@ Almo-Do评论在某种配置文件中是特定的。

$environments = array(
  'localhost' = > 'local'
, 'staging.mysite.com' > 'staging'
// etc - see? now you can comment some out
//, 'mysite.com' => 'live'
);

然后简单地

define ('APP_ENV', $environments[$_SERVER['SERVER_NAME']]);

或者甚至在此之前更加防守,例如:

if (!array_key_exists($environments[$_SERVER['SERVER_NAME'])) die('suitable msg');