PHP - 如果是这种情况,啥也不做

Posted

技术标签:

【中文标题】PHP - 如果是这种情况,啥也不做【英文标题】: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();... 我将编辑我的问题。 【参考方案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】:

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

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

【讨论】:

以上是关于PHP - 如果是这种情况,啥也不做的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 单击时按钮类型提交啥也不做

Mongo:如果文档不存在则创建,否则啥也不做

Mongo:如果文档不存在则创建,否则啥也不做

如果您的 UIScrollView 已经处于该缩放级别,则 zoomToRect 啥也不做

MKOverlayView 性能问题。啥也不做。但慢

如果从函数内部执行,带有“apply_async”的多处理池啥也不做