如何退出PHP代码块?

ome*_*ega 17 html php code-design

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

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

<?php
    print("2");
?>
Run Code Online (Sandbox Code Playgroud)

所以,如果A是真的,那么结果是12,如果A是假,那么结果是2.

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

gd1*_*gd1 31

goto操作员,但我强烈建议不要使用这种技巧("意大利面条代码").你最好使用结构化if块,它们没有任何问题.

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

在此输入图像描述

  • +1.一张图片说这里有千言万语:-) (7认同)
  • 我不是因为答案中有建设性的"包含"部分而对此进行投票.这张照片很有趣,但不具有建设性.我知道再次goto很受欢迎,但是goto本身并不总是意味着意大利面条代码.为了打破程序流程,喜欢从循环中间跳到另一个函数的中间是滥用和意大利面条.但如果跳转是明确的并且没有打破上下文(就像在这种情况下),我相信它可以使用. (5认同)
  • @JanTuroň:是的,我仍然在我的一些C程序中使用goto,例如从嵌套循环中到达一般错误处理块.goto的问题在于,一旦你以合法的方式开始使用它,你很快就会开始使用它来"修补"设计不佳的控制流程.但是,你的观点很好......我总是试着让我的答案具有建设性. (2认同)
  • 我认为没有人觉得需要,简单......而且<?php块不是结构化块,实际上if可以被?>中断并且用<?php恢复.在这种情况下,想想如果这样的功能确实存在会出现的混乱. (2认同)

Jan*_*roň 18

可能有两种解决方案:

1)少hacky

在单独的文件中包含块中的代码.您可以return在其中使用它来停止处理包含的文件

//file1.php
if (!A) return;
print("1");

// file2.php
print("2");

<?php include "file1.php";?>
<?php include "file2.php";?>  
Run Code Online (Sandbox Code Playgroud)

2)更hacky(其他人可能会杀了我)

将块放入do { ... } while(false);块中并从中断

<?php do {
    if (!A) break;
    print("1");
} while(false); ?>

<?php do {
    print("2");
} while(false); ?>
Run Code Online (Sandbox Code Playgroud)

  • +1.我会先杀掉你的第一个:只为一个代码行浪费一个完整的文件:-P但我喜欢的第二个:-) (2认同)
  • 我相信这个问题已经缩小了,并且该块是一些复杂的一致代码,值得分离文件.也许.第二个肯定更适合短片,但第一眼看上去可能很吓人. (2认同)

bwo*_*ebi 12

不,没有.但是你可以做的是在每个块的末尾添加一个标签然后使用goto(不推荐,但是当你不想要一个大if...时...(ps:在这里看到@ gd1的答案作为提示;-P )).

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

<?php
    print("2");
exit_2: ;
?>
Run Code Online (Sandbox Code Playgroud)

  • @Precastic我不推荐它,我说如果OP强烈感觉必须使用它,它将是唯一的选择. (6认同)
  • @Precastic:来自你的链接:*复杂而纠结的控制结构,特别是使用很多GOTO*的人 - 看到许多字?看看Matthias Buelens的代码(没有冒犯) - 这是带有纠结结构的意大利面条代码.上面的例子根本没有纠结.Goto并不总是意味着意大利面. (4认同)
  • @Precastic a)是一个'strg + f`那么难?我同意你应该...大多数人避免使用goto,但有一些用例.不能在PHP中立即告诉一个,但在C中你不能一次破坏多个嵌套循环.所以你只需在循环的末尾放置一个标签并使用goto.如果你有X个相邻,或者更糟糕的重叠,那么你应该清楚地重新设计你的代码,但没有人应该抱怨标签靠近的goto.(tl; dr:线性跳跃是可以的(在程序流程之后),交叉跳跃不是(跳回,向前,从一个标签到下一个标签等).) (2认同)

ter*_*ško 8

如果这只是一个实验,你做错了.停止使用面向包含的编程作为开始学习OOP.

嗯...你总是可以<?php ?>用匿名函数包装内容;

<?php $f = function () use (&$a) {

    if ($a)
    { 
        echo 1;
        return;
    }
    echo 2;

};$f(); ?>

<?php $f = function () {

    echo 2;

};$f(); ?>
Run Code Online (Sandbox Code Playgroud)

这适用于PHP 5.3+.如果需要共享变量,可以use()在定义中使用statement 注入它们.

但让我再说一遍:

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


Jan*_*sen 6

如果你太过尊重极客流行文化并觉得你需要适应(并且受欢迎!),这里的解决方案没有goto:

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

<?php
    print("2");
?>
Run Code Online (Sandbox Code Playgroud)