首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用开关、If或三元在PHP中设置变量的高效/非冗余方式

用开关、If或三元在PHP中设置变量的高效/非冗余方式
EN

Stack Overflow用户
提问于 2013-10-22 01:13:32
回答 3查看 181关注 0票数 0

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

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

我刚读到的那个开关语句要比if/elseif/ due块更具可读性,而且我可以看到它是如何由于对齐而更加可读性的。

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

黑入Enum

代码语言:javascript
复制
class eUserType
{
    const Normal = 0;
    const Admin = 1;
    const Moderator = 2;
}

如果.如果

代码语言:javascript
复制
if ($userType == eUserType::Normal)
    $info = "Normal User";
elseif($userType == eUserType::Admin)
    $info = "Admin User";
elseif($userType == eUserType::Moderator)
    $info = "Moderator User";
else
    $info = false;

交换机

代码语言:javascript
复制
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)所做的那样。

代码语言:javascript
复制
$info = $userType == eUserType::Normal ? 
            "Normal User" : 
        $userType == eUserType::Admin ? 
            "Admin User" : 
        $userType == eUserType::Moderator ? 
            "Moderator User" : false; 

我假设我应该将它包装到一个函数/方法中,返回$info,而不关心函数中的是什么?

我想知道是否有什么很好的方法来做这样的事情,但我还没见过。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-22 01:16:50

使用数组怎么样?

代码语言:javascript
复制
$labels = array(
  eUserType::Normal => "Normal User",
  ...
);

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

是的,反射也是可能的(不过,我不会这样做,你不能用这种方式定位字符串):

代码语言:javascript
复制
$class = new ReflectionClass('eUserType');
$key   = array_search($userType, $class->getConstants());

return ($key !== false) ? sprintf('%s User', $key) : false;
票数 1
EN

Stack Overflow用户

发布于 2013-10-22 01:37:14

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

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

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

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

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

我的最后一个评论是,开关可能容易出错,而意外的误用会使调试变得乏味。如果您使用的是“继续”或“中断”,或者更准确地说:有时故意不使用“继续”或“中断”,我发现很容易犯错误,在复杂的逻辑中迷失方向。

因此,对于我的钱,三元单行,如果/或其他是通用的,去工具,除非我有非常大的或动态的条件,或逻辑需要一些行为,只有开关可以提供。

票数 0
EN

Stack Overflow用户

发布于 2013-10-22 02:20:23

三元表示只有两个可能的值。你发布的例子要么是开关,要么是if / else“梯子”。这真的只是一个偏好的问题。没有明确的理由使用一个而另一个,当然,除非在每个检查中有一个以上的条件(开关只检查一件东西)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19507434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档