最近很多人指责我只提到一个词——“goto”。
这让我想知道,为什么它被认为是一个如此讨厌的词。
我知道之前关于该主题的几次讨论,但这并不能说服我 -有些答案只是说“这很糟糕”,甚至没有试图解释,有些还带来了与 PHP、IMO 等脚本语言无关的原因。
无论如何,我要问一个非常特别的问题:
让我们比较goto
和throw
陈述。
在我看来,两者都做同样的事情:避免基于某些条件执行某些代码部分。
如果是这样 - 是否throw
有与 goto 相同的缺点?(如果有的话)?
如果不是 - 那就是区别。
任何有足够经验的人,谁能说出以下两个代码片段的代码结构之间的基本概念差异?
关于这些非常代码片段,而不是“理论上”或“一般”或“这是一个不错的 XKCD 漫画!”。
为什么第一个被认为是聪明的,而后一个被认为是最致命的罪恶?
#$a=1;
#$b=2;
/* SNIPPET #1 */
try {
if (!isset($a)) {
throw new Exception('$a is not set');
}
if (!isset($b)) {
throw new Exception('$b is not set');
}
echo '$a + $b = '.($a + $b)."<br>\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "<br>\n";
}
/* SNIPPET #2 */
if (!isset($a)) {
$message = '$a is not set';
goto end;
}
if (!isset($b)) {
$message = '$b is not set';
goto end;
}
echo '$a + $b = '.($a + $b)."<br>\n";
end:
if (!empty($message)) {
echo 'Caught exception: ', $message, "<br>\n";
}
请注意,我知道 throw在制作意大利面条时更加强大和灵活。这对我来说没有主要区别。这是使用问题,而不是概念问题。
编辑
很多人告诉我,第一个示例应该更新使用。
原因:异常应该只用于处理错误,而不是实现业务逻辑。
看起来很明智。
因此,停止无用代码执行的唯一方法是goto(更不用说一些替代品,例如while,return等,它们是相同的,但更难实现)?