【问题标题】:Advise on simplifying a PHP statement关于简化 PHP 语句的建议
【发布时间】:2015-06-22 16:54:19
【问题描述】:

我是 PHP 新手,正在为 Joomla K2 项目布局编写模板文件。

我配置了一个“额外字段”$extrafields[15],其输出为“是”、“否”或“”。 $extrafields[16] 是一个文本字符串。

我有这段代码,它可以工作,但会就如何简化它提出建议,因为我知道它可能有点粗糙!

if (!empty($extrafields[15])): 
    if ($extrafields[15] == "Yes") {
        echo "<span class=sgl-bold>Sponsored by:&nbsp;</span>"; 
    }

    if ($extrafields[15] == "Yes"):
        if (!empty($extrafields[16])):
            echo $extrafields[16]; 
        endif;
        echo "<br>";
    endif;
endif;

【问题讨论】:

  • if (something is true) { if (it's still true) { ... } } 是相当多余的......

标签: php joomla coding-style


【解决方案1】:

我倾向于做这样的事情:

if(!empty($extrafields[15]) && !empty($extrafields[16])){ 
    if($extrafields[15] == "Yes"){
        echo "<span class=sgl-bold>Sponsored by:&nbsp;</span>"; 
        echo $extrafields[16]; 
        echo "<br>";
    } //endif not empty
} //endif yes

【讨论】:

  • 这对相同的输入数据产生与原始代码 sn-p 不同的结果。
  • @boundryfunctions 我将意图解释为在满足 IF 条件时打印包含 $extrafield[16] 的一行文本。
  • ...您可能是对的,只是想指出这一点。
  • 感谢@BigScar - 我知道这不是我的代码所做的“完全”,它实际上适合我的用例,所以谢谢!这更整洁,而且我在不知道正确语法的情况下尝试了什么。
  • 仅供他人参考,我认为有一个杂散的'}'和一个丢失的endif;。好吧,我需要添加它以使其运行! &lt;?php if(!empty($extrafields[15]) &amp;&amp; !empty($extrafields[16])): if($extrafields[15] == "Yes"){ echo "&lt;span class=sgl-bold&gt;Sponsored by:&amp;nbsp;&lt;/span&gt;"; echo $extrafields[16]; echo "&lt;br&gt;"; } endif; ?&gt;
【解决方案2】:

您可以通过一些简单的调整使您的代码更简洁:

  • 尽可能去掉多余的 if 子句,
  • 在有意义的地方组合 if 子句条件,并且
  • 不要将alternative syntax 用于您的控制结构以减少噪音。

以下 sn-p 保留了与您最初尝试相同的功能,但更容易理解。

if (!empty($extrafields[15]) && 'Yes' === $extrafields[15]) {
    echo '<span class=sgl-bold>Sponsored by:&nbsp;</span>';
    if (!empty($extrafields[16])) {
        echo $extrafields[16];
    }
    echo '<br>';
}

也就是说,从上下文来看,您可能希望使用此处发布的solution BigScar。

为了使这个 sn-p 更容易理解,您应该考虑处理数据结构(尽管我认为这是 Joomla 强加给您的):

  • 而不是像 $extrafields[16] 这样的数值数组中的值,而是使用像 $showSponsor 这样的说话变量名称,并且
  • 使用布尔值truefalsenull,而不是'Yes'、'No' 和'' 的字符串值。

记住:

There are only two hard things in Computer Science: cache invalidation and naming things.

【讨论】:

  • 感谢@boundaryfunctions - 是的,我最终选择了 BigScar 的版本,但这也很有帮助。数据结构是 Joomla 的 K2 CCK 扩展的数据结构,而不是我自己的。不过,根据我自己的理解,您能否解释一下“更具语言性的数据结构”是什么意思?
  • 感谢您的评论 @NicNic,我编辑了我的答案,希望能明确我想说的话。
  • 感谢@boundaryfunctions - 这很有意义!遗憾的是扩展开发人员没有采用这种方法。我想当用户可以创建无限数量的“额外”字段时,这是一个一致性问题。
【解决方案3】:
if (@$extrafields[15] == "Yes") { 
    echo "<span class=sgl-bold>Sponsored by:&nbsp;</span>"; 
    echo @$extrafields[16]; 
    echo "<br>";
}

【讨论】:

  • 使用error suppression operator @ 应始终谨慎使用——如果使用的话。不应该鼓励使用它来避免isset()empty(),因为它会使调试成为一场噩梦。
  • 我同意 @ 不应该用于更高级别的函数。但是在哈希映射的情况下,它确实不会使代码比其他语言更难调试,如果没有设置键则不会抛出警告(例如Java的HashMap)。密钥存在或不存在。 PHP中哈希的实现有点傻IMO。使上述代码难以调试的原因是它使用数字键而不是字符串。 15 或 16 没有任何意义。
  • 对于像这样的简单输出,我使用@ 没有问题。它使代码易于阅读并完成工作。
  • 谢谢,这肯定是最简洁的(嗯,最短的)。我假设@停止显示错误?为什么这个例子会出错。对于初学者来说,这是最合乎逻辑的例子!
  • 是的,没错。在 PHP 中,如果您尝试访问未初始化的键/位置,哈希/数组将打印出警告。例如echo $extrafields['non-existent-key'] 将用噪音填满日志(如果您正在记录警告)。有几种方法可以避免警告:(1) 您可以检查密钥是否已定义,例如使用!empty()isset)()。或者 (2) 抑制警告并对值进行逻辑检查,而不是键。如果该值不为空,则您知道键已设置。
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 2021-04-11
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多