17

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

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

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

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

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

4

7 回答 7

33

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

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

在此处输入图像描述

于 2013-06-16T17:15:33.677 回答
20

可能有两种解决方案:

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); ?>
于 2013-06-16T17:24:16.707 回答
12

不,没有。但是您可以做的是在每个块的末尾放置一个标签,然后使用goto(不推荐,但是当您不想要大if...时(ps:请参阅@gd1的答案作为提示;-P ))。

<?php
    if (!A) goto exit_1;
    print("1");
exit_1: ;
?>

<?php
    print("2");
exit_2: ;
?>
于 2013-06-16T17:14:12.803 回答
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()在定义中用语句将它们注入到作用域中。

但让我再说一遍:

如果你想在生产代码中做这样的事情,你做错了。

于 2013-06-16T18:43:24.630 回答
6

如果你太尊重极客流行文化并且觉得你需要适应(并且变得流行!),这里有一个没有goto:

<?php
call_user_func(function() {
    if (!A) return;
    print("1");
});
?>

<?php
    print("2");
?>
于 2013-06-16T18:03:00.820 回答
4

不,这没有任何意义。想象一下你可以做到这一点,并且你有这段代码:

<?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。这些通过故意阻止您跳到您想要的任何地方来提供结构。

于 2013-06-16T17:24:32.157 回答
0

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

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

每个人都说goto语句不好,但有一些有效的用途goto可以使代码更易于理解,例如跳出深度嵌套的控制结构和跳到 PHP 代码块的末尾(假设不存在内置的语言结构)这样做)。

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

于 2013-10-29T00:32:44.770 回答