在PHP中,是否可以退出PHP代码块(即PHP标记)?
<?php
if (!A) phpexit();
print("1");
?>
<?php
print("2");
?>
因此,如果A
为真,则结果为12
,如果A
为false,则结果为2
。
我知道你可以用if语句或其他东西来做这件事,但我想知道是否还有一些特殊的PHP函数可以做到这一点。
答案 0 :(得分:30)
有goto
运算符,但我强烈反对使用这种技巧(“意大利面条代码”)。您最好使用结构化if
块,它们没有任何问题。
在使用goto
之前,请考虑替代解决方案:例如,根据include
条件,您可以A
使用不同的脚本。
答案 1 :(得分:18)
可能有两种解决方案:
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); ?>
答案 2 :(得分:12)
不,没有。但你可以做的是在每个块的末尾添加一个标签,然后使用goto
(不推荐,但是当你不想要一个大的if
时...(ps:见答案) @ gd1作为提示在这里;-P))。
<?php
if (!A) goto exit_1;
print("1");
exit_1: ;
?>
<?php
print("2");
exit_2: ;
?>
答案 3 :(得分:8)
如果这只是一个实验,你做错了。停止使用面向包含的编程作为开始学习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()
语句将它们注入范围。
但让我再说一遍:
如果您想在生产代码中执行类似的操作,那么您做错了。
答案 4 :(得分:6)
如果你过分尊重极客流行文化,觉得你需要适应(并且受欢迎!),这里是一个没有goto
的解决方案:
<?php
call_user_func(function() {
if (!A) return;
print("1");
});
?>
<?php
print("2");
?>
答案 5 :(得分:4)
不,这没有意义。想象一下,你可以这样做,你有这段代码:
<?php
if (!A) phpexit();
if (B) {
?>
<b>Foo</b>
<?php
}
?>
<i>Baz</i>
phpexit()
会跳到哪里? then
的{{1}}块跳出并进入PHP块,但您不想从if (B)
跳转到<b>Foo</b>
,对吧?在没有检查条件的情况下跳入if (!A)
块是没有意义的。
As gd1 already showed,您可以使用then
执行此操作,但它会使您的代码非结构化。当你的代码遍布各处时,你会非常难以理解代码的流程(<和p>未来的维护者)。
在低级语言(即汇编语言)中,仅可以跳转使用,但在更高级的语言中,您使用goto
,if
等结构来抽象它们和for
。这些提供了故意阻止你跳到任何你想要的地方的结构。
答案 6 :(得分:0)
由于错误情况(数据库连接错误,输入无效等),我遇到了需要跳过PHP代码块其余部分的几种情况。作为一名学生,我的教授只使用die
,它会完全停止解析文件,使页面不完整,没有页脚甚至HTML结束标记</body></html>
。即使出现错误,也没有理由通过切断结束标记来生成无效的HTML。
当然,纯粹结构化的方法会使用if
语句,这在绝大多数情况下都优于goto
。但是,我觉得如果你只是试图跳出PHP代码块,那么将大段代码放在if
/ else
结构中是相当不优雅的,实际上可以使代码更难理解而不是简单地使用跳转到PHP块最后端的goto
语句,就在?>
之前,因为很难记住一大堆代码实际上是条件的一部分声明在if
或elseif
行以下50行以上。
每个人都说goto
语句很糟糕,但goto
的有效用途使代码更易于理解,例如跳出深层嵌套的控件结构并跳到结尾PHP代码块(假设没有内置的语言结构)。
像goto
这样的代码构造本质上并不是邪恶的。这取决于你如何使用它。