在 PHP 中,是否可以从 PHP 代码块(即 PHP 标签)中退出?
<?php
if (!A) phpexit();
print("1");
?>
<?php
print("2");
?>
因此,如果A
为真,则结果为12
,如果A
为假,则结果为2
。
我知道你可以用 if 语句或其他东西来做到这一点,但我想知道是否还有一些特殊的 PHP 函数可以做到这一点。
有goto
运营商,但我强烈建议不要使用这种技巧(“意大利面条代码”)。您最好使用结构化if
块,它们没有任何问题。
在使用之前goto
,请考虑替代解决方案:例如,您可以include
根据A
条件使用不同的脚本。
可能有两种解决方案:
1) 少hacky
将块中的代码包含在单独的文件中。您可以return
在它们中使用来停止处理包含的文件
//file1.php
if (!A) return;
print("1");
// file2.php
print("2");
<?php include "file1.php";?>
<?php include "file2.php";?>
2)更hacky(其他人可能会杀了我)
将块放入do { ... } while(false);
块并从中打破
<?php do {
if (!A) break;
print("1");
} while(false); ?>
<?php do {
print("2");
} while(false); ?>
不,没有。但是您可以做的是在每个块的末尾放置一个标签,然后使用goto
(不推荐,但是当您不想要大if
...时(ps:请参阅@gd1的答案作为提示;-P ))。
<?php
if (!A) goto exit_1;
print("1");
exit_1: ;
?>
<?php
print("2");
exit_2: ;
?>
如果这不是为了实验,那你就做错了。在开始学习 OOP 时停止进行面向包含的编程。
好吧...您总是可以将<?php ?>
内容包装在匿名函数中;
<?php $f = function () use (&$a) {
if ($a)
{
echo 1;
return;
}
echo 2;
};$f(); ?>
<?php $f = function () {
echo 2;
};$f(); ?>
这适用于 PHP 5.3+。如果你需要共享变量,你可以use()
在定义中用语句将它们注入到作用域中。
但让我再说一遍:
如果你想在生产代码中做这样的事情,你做错了。
如果你太尊重极客流行文化并且觉得你需要适应(并且变得流行!),这里有一个没有goto
:
<?php
call_user_func(function() {
if (!A) return;
print("1");
});
?>
<?php
print("2");
?>
不,这没有任何意义。想象一下你可以做到这一点,并且你有这段代码:
<?php
if (!A) phpexit();
if (B) {
?>
<b>Foo</b>
<?php
}
?>
<i>Baz</i>
会phpexit()
跳到哪里?then
跳出和跳入 PHP块的if (B)
块,但您不想跳到<b>Foo</b>
from if (!A)
,对吗?then
如果不检查条件就跳入一个块是没有意义的。
正如 gd1 已经展示的那样,您可以这样做,goto
但它会使您的代码变得非结构化。当您的代码到处乱跳时,您自己(以及您的代码的未来维护者)将很难理解您的代码流程。
在低级语言(即汇编)中,您只能使用跳转,但在高级语言中,您可以使用诸如 和 之类的结构将它们if
抽象for
出来while
。这些通过故意阻止您跳到您想要的任何地方来提供结构。
我遇到过几种情况,由于错误情况(数据库连接错误、无效输入等),需要跳过 PHP 代码块的其余部分。作为一名学生,我的教授只是使用die
,它完全停止解析文件,使页面不完整,没有页脚甚至 HTML 结束标签</body></html>
。即使出现错误,也没有理由通过切断结束标签来生成无效的 HTML。
当然,纯粹的结构化方法会使用if
语句,这比goto
在绝大多数情况下更可取。但是,我觉得如果你只是想跳出一个 PHP 代码块,将大段代码放在if
/else
结构中是相当不雅的,实际上可能使代码更难理解,而不是简单地使用goto
跳转到的语句PHP 块的最后,就在 之前?>
,因为很难记住一大堆代码实际上是条件语句的一部分,在if
or行下方 50 多elseif
行。
每个人都说goto
语句不好,但有一些有效的用途goto
可以使代码更易于理解,例如跳出深度嵌套的控制结构和跳到 PHP 代码块的末尾(假设不存在内置的语言结构)这样做)。
像这样的代码构造goto
本质上并不是邪恶的。这取决于你如何使用它。