0

进行多次检查时设置单个变量的最佳方法是什么?必须有一些有效、精确、非冗余、可读的方法来做到这一点?

我很少使用 Switch 语句,因为我发现它们非常多余,每次检查通常会占用 3-4 行,而您通常可以通过简单的 1-2 行检查来逃避,随着您进行更多检查,这些语句会加起来。

我刚刚读到 Switch 语句与 if/elseif/else 块相比更具可读性,我可以看到由于对齐而更具可读性。

我喜欢使用三元语句,因为它允许您使用单个变量声明,而不是编写冗余代码,但对我来说,switch 语句似乎过于冗余加上它的代码(行消耗)开销。

入侵枚举

class eUserType
{
    const Normal = 0;
    const Admin = 1;
    const Moderator = 2;
}

如果否则如果如果

if ($userType == eUserType::Normal)
    $info = "Normal User";
elseif($userType == eUserType::Admin)
    $info = "Admin User";
elseif($userType == eUserType::Moderator)
    $info = "Moderator User";
else
    $info = false;

转变

switch($userType)
{
    case eUserType::Normal:
        $info = "Normal User";
        break;
    case eUserType::Admin:
        $info = "Admin User";
        break;
    case eUserType::Moderator:
        $info = "Moderator User";
        break;
    default:
        $info = false;
}

三元

我以前从未写过这样的三元组,并在上面使用了我自己的空白。它看起来精确而高效,但我仍然觉得这非常多余:“$userType == eUserType::”。另外,我假设大多数 IDE 不会很好地处理代码的自动缩进,因为我没有(PHPStorm)。

$info = $userType == eUserType::Normal ? 
            "Normal User" : 
        $userType == eUserType::Admin ? 
            "Admin User" : 
        $userType == eUserType::Moderator ? 
            "Moderator User" : false; 

我假设我应该将它包装到一个函数/方法中,返回 $info 而不在乎函数内部有什么?

我想知道是否有一些很棒的方法可以做这样的事情,我还没有见过。

最终,我认为我正在寻找的是三元的单变量设置与 switch 语句的单变量检查的混合体。(怀疑它是否存在,但为什么不问呢?)

编辑:我知道如果遵循严格的模式,肯定有一种方法可以使用反射使此代码动态化,但我使用设置为 $info 的数据作为简单的示例数据,而不是我正在使用的复杂对象。我想我最终会将这些检查扔到用户类中,以实现任何可能的可重用性。

4

3 回答 3

1

使用数组怎么样?

$labels = array(
  eUserType::Normal => "Normal User",
  ...
);

return isset($labels[$userType]) ? $labels[$userType] : false;

是的,反射也是可能的(不过我不会这样,你不能这样本地化你的字符串):

$class = new ReflectionClass('eUserType');
$key   = array_search($userType, $class->getConstants());

return ($key !== false) ? sprintf('%s User', $key) : false;
于 2013-10-22T01:16:50.413 回答
0

三元适用于只有两个可能值的情况。您发布的示例应该是开关或 if / else “阶梯”。这实际上只是一个偏好问题。没有明确的理由使用一个而不是另一个,除非每个检查中当然有多个条件(开关只检查一件事)。

于 2013-10-22T02:20:23.473 回答
0

我认为这主要是主观的,但是......不要使用三元:

“建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时 PHP 的行为是不明显的:” - http://php.net/manual/en/language.operators.comparison .php

否则,我总是发现 if 语句更具可读性,因为它们比 switch 更常见、更熟悉:除非你有大量的选择。添加新开关比添加新 if/else 块更快。

switch 的性能参数是:“在 switch 语句中,条件只评估一次,并将结果与​​每个 case 语句进行比较。在 elseif 语句中,再次评估条件。如果您的条件比简单的比较更复杂和/或处于紧密循环中,切换可能更快。” - http://php.net/manual/en/control-structures.switch.php

您的示例是“简单比较”。

我最后的评论是 switch 很容易出错,而意外的误用会使调试变得乏味。如果您使用 continue 或 break,或者更准确地说:故意不使用 continue 或 break有时,我发现很容易出错并迷失在复杂的逻辑中。

所以为了我的钱,单线的三元,if/else 是万能的,首选工具,除非我有非常大或动态的条件,或者逻辑需要一些只有 switch 才能提供的行为。

于 2013-10-22T01:37:14.730 回答