【问题标题】:PHP - If something is the case, do nothingPHP - 如果是这种情况,什么也不做
【发布时间】:2011-04-07 18:09:11
【问题描述】:

这样说是否合适:如果是这种情况,什么也不做?

if ( ($hostNameInfo == $hostNameInput) && ($hostAddressInfo == $hostAddressInput) )
{
  return;
}

更新: 我不在函数内部。 :( 所以回报只是一派胡言。

这里有更多代码:

//if the input fields are equal to database values, no need to update and waste resources,hence, do nothing:
if ( ($hostNameInfo == $hostNameInput) && ($hostAddressInfo == $hostAddressInput) )
{
  //do nothing
}
//If, however, (they are NOT equal and) input fields are not empty:
elseif (!empty($hostNameInput) && (!empty($hostAddressInput)))
{
 //do something.
}

提前致谢, 内存

【问题讨论】:

  • 你并没有在那里什么都不做:你正在从一个函数返回。这就是你想要的吗?
  • @Pekka:没有。 :( 我这里没有函数。我不能使用 break; 或 exit();... 我将编辑我的问题。

标签: php logic


【解决方案1】:

也许你应该做相反的事情,如果你的条件没有得到验证,就做点什么

if($hostNameInfo != $hostNameInput || $hostAddressInfo != $hostAddressInput) {
   // do something
}

【讨论】:

  • +1 让代码“什么都不做”不是好的做法,应该避免。
  • 恕我直言,在函数开头检查先决条件并在不需要执行任何操作时返回更简洁。并且您节省了一个缩进级别! :)
  • @phadej :我个人觉得在一个函数中只有一个 return 而不是将其用作 void return 会更干净。如果它是一个预编码,为什么不在调用函数之前检查呢?
  • @Serty:对不起,我已经编辑了我的代码,这不仅仅是 if 条件是 if else。不过,您的答案仍然适用吗?我的意思是,处理这种“什么都不做”的最好方法是,实际上忽略它?我明白了吗?
  • @Serty:这取决于。我的意思是先决条件检查问题。它们可能非常复杂或只是那么长,以至于将它们分开比尝试将它们加起来成为一个条件更容易。此外,您可能会争辩遵循 jensgram 解决方案,但计算所有这些并不总是很便宜,有时甚至是不可能的,好像如果之前的检查已经失败,那么以后的检查是不明智的。
【解决方案2】:

什么也不做,您只需键入:

function relax() {
    ;
}

if (($hostNameInfo == $hostNameInput) && ($hostAddressInfo == $hostAddressInput)) {
    relax();
}

【讨论】:

  • 对此投了赞成票,因为它确实回答了问题。
  • 对此感到好奇... PHP 手册中是否提到过这个?
  • 据我所知,PHP手册中没有提到这一点。这是 C 的一个古老特征。
【解决方案3】:

我假设你在一个函数中,在这种情况下它会按照你的预期执行,尽管函数中的多个 return 语句可能会导致混乱和缺乏可读性。(显然我错了。)

相反,我更喜欢让所有条件块(我对if{...} 块之间的代码的描述)包含相关代码,即以这样的方式编写条件检查,即总条件当需要额外处理(子流)时,计算结果为 true

if ($hostNameInfo != $hostNameInput || $hostAddressInfo != $hostAddressInput) {
    // do stuff, else skip
}

此外,您可以提取条件语句以提高可读性和控制流的简单性:

$hostInfoEqualsInput = ($hostNameInfo == $hostNameInput && $hostAddressInfo == $hostAddressInput);
if (!$hostInfoEqualsInput) {
    ...
}

更新(基于更新的问题)。请考虑一下:

$fieldsAreFilled = (!empty($hostNameInput) && !empty($hostAddressInput));
$hostInfoEqualsInput = ($hostNameInfo == $hostNameInput && $hostAddressInfo == $hostAddressInput);

if ($fieldsAreFilled && !$hostInfoEqualsInput) {
    ...
}

ERGO
通过编写您想要满足的条件,而不是您想要忽略的所有异常(主观),最小化分支率并避免空块。

【讨论】:

  • 哦...所以我们不仅可以在变量上存储值,而且还可以存储状态或条件?我不知道那件事。因此,根据 Serty Oan 的回答和 Pekka cmets,我们应该知道,如果我们遇到必须评论的情况,例如 //do nothing 这可能意味着我们没有正确地构建我们的代码 hm?
  • 我会考虑 Serty Oan 的答案,但我会将您的答案标记为相关。非常感谢您抽出宝贵时间,我将就另一个问题提出我的评论问题。这本身就是一个自我问题。 :) 再次感谢,MEM
  • @MEM 好吧,存储的“条件”(例如,$fieldsAreFilled)实际上只是右侧表达式的布尔值。这里没有魔法。
  • 嗯...但是我在稍后理解条件时遇到了麻烦:if(true and !true) 做什么?那是什么意思?...如果您觉得,当然..有点迷茫,请回复。
  • @MEM 基本上就是这样写的更不言自明:if ((!empty($hostNameInput) && !empty($hostAddressInput)) && !($hostNameInfo == $hostNameInput && $hostAddressInfo == $hostAddressInput)) { ...
【解决方案4】:

您在这里谈论的是最佳实践..
最佳实践之一是例程应该有 single exit point,尽管它是 widely discussed 并且取决于开发人员/风格。

更新:

新答案,因为问题已更改:

如果代码应该只在某些情况下运行,没有理由添加额外的检查。为了使代码更具可读性,你应该坚持任何你认为易于维护的东西,像这样(或类似的东西):

// Do something only if required
if (($hostNameInfo != $hostNameInput) || ($hostAddressInfo != $hostAddressInput)) &&
    !empty($hostNameInput) && !empty($hostAddressInput))
{
    echo 'place some code here';
}

【讨论】:

  • 感谢那个单一的出口点。我不知道。它与功能有关,但我的问题误导了这个方向。感谢您花时间更新您的问题。我会将您的问题标记为相关。问候。
  • 这些empty() 电话工作量太大。变量已经被假定为已声明,因此您只需要真实检查&& $hostNameInput && $hostAddressInput
【解决方案5】:

本机 do_nothing() 函数有时会非常好读。

为了避免强调来自语法检查器和 linter 的警报,当你有一个空的 if 块时会发疯,我使用:

echo(null);

【讨论】:

    【解决方案6】:

    另一种可能性是抛出一个新异常,您可以稍后在应用程序中捕获它。

    更新:不在函数内部,这可能是个坏主意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多