如何退出PHP代码块?

时间:2013-06-16 17:09:06

标签: php html code-design

在PHP中,是否可以退出PHP代码块(即PHP标记)?

<?php
    if (!A) phpexit();
    print("1");
?>

<?php
    print("2");
?>

因此,如果A为真,则结果为12,如果A为false,则结果为2

我知道你可以用if语句或其他东西来做这件事,但我想知道是否还有一些特殊的PHP函数可以做到这一点。

7 个答案:

答案 0 :(得分:30)

goto运算符,但我强烈反对使用这种技巧(“意大利面条代码”)。您最好使用结构化if块,它们没有任何问题。

在使用goto之前,请考虑替代解决方案:例如,根据include条件,您可以A使用不同的脚本。

enter image description here

答案 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>未来的维护者)。

在低级语言(即汇编语言)中,可以跳转使用,但在更高级的语言中,您使用gotoif等结构来抽象它们和for。这些提供了故意阻止你跳到任何你想要的地方的结构。

答案 6 :(得分:0)

由于错误情况(数据库连接错误,输入无效等),我遇到了需要跳过PHP代码块其余部分的几种情况。作为一名学生,我的教授只使用die,它会完全停止解析文件,使页面不完整,没有页脚甚至HTML结束标记</body></html>。即使出现错误,也没有理由通过切断结束标记来生成无效的HTML。

当然,纯粹结构化的方法会使用if语句,这在绝大多数情况下都优于goto。但是,我觉得如果你只是试图跳出PHP代码块,那么将大段代码放在if / else结构中是相当不优雅的,实际上可以使代码更难理解而不是简单地使用跳转到PHP块最后端的goto语句,就在?>之前,因为很难记住一大堆代码实际上是条件的一部分声明在ifelseif行以下50行以上。

每个人都说goto语句很糟糕,但goto的有效用途使代码更易于理解,例如跳出深层嵌套的控件结构并跳到结尾PHP代码块(假设没有内置的语言结构)。

goto这样的代码构造本质上并不是邪恶的。这取决于你如何使用它。