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 - 如果是这种情况,啥也不做的主要内容,如果未能解决你的问题,请参考以下文章