不使用die()或exit()结束php标签

6
我想知道PHP是否有一个函数可以让我在到达"?>"标记之前结束一个进程,例如:
<?php

    echo 'first';

    endphptag();

    echo 'second';

?>

third

<?php

    echo 'fourth';

?>

那么输出应该是:
first

third

fourth

我知道有些人认为这个没用,但是我想在iframe上的验证脚本中使用它,而不是使用dieexit函数,因为它会停止整个脚本,我只想结束其中的一部分。
通常我使用if-else代替它,但是我想避免这样做,因为这些过程很大,我想要更易读的东西。顺便说一句,在我的ajax脚本中我使用if-die,我也想在我的iframes中使用类似的东西,谢谢!
好的,我只是想知道PHP是否已经有了适当的函数(似乎没有),所以我想我会继续使用if-else,因为为了使其"更易读"而使用更多的进程并不值得(例如:try-catch使用太多资源,我也不会使用goto)。我的疑问仅仅是这个,我将仅在使用die函数的ajax文件中使用这个程序(我不知道是否推荐,但我认为没有问题,因为PHP应该有它的原因)。

6
如果你需要这样的函数,那么你可能并没有做对它的本意。 - jeremy
我不太明白你想做什么。关闭 PHP 标签对执行没有任何影响...只是指定了 PHP 代码的位置。你是否在寻找 breaknext - Brad
我更喜欢使用 if/else 语句。 - Ricardo Alvaro Lohmann
5个回答

4

异常就是您要寻找的内容:

try {
    // code
} catch (Exception $e) {
    // handling
}

你需要将代码放在try块中,并使用throw new Exception();抛出异常,这样只有try块内余下的代码会被退出。

你的代码应该如下所示:

<?php
    try {
        echo 'first';
        throw new Exception();
        echo 'second';
    } catch (Exception $e) {}
?>
third
<?php
    echo 'fourth';
?>

3
通常不建议使用异常来进行分支处理。 - Eric Petroelje
@EricPetroelje,退出特定代码块正是异常的用处所在。 - Shoe

3

我要说一下,虽然可能会引起争议,但如果你真的需要这么做,goto 其实是一个不错的选择:

<?php

    echo 'first';

    goto endofblock;

    echo 'second';

endofblock:

?>

或者你可以使用伪循环来避免使用goto的"邪恶"。 对于编译器而言,它们基本上看起来是相同的,但其他程序员不会因为你使用了goto而抨击你。

<?php
do {
    echo 'first';

    break;

    echo 'second';
} while (false)        
?>

1

0
如果我是你,我会省略掉结尾的 PHP 标签。大多数编程标准不建议使用它,原因太长,在此无法解释。
但是除此之外,可以继续使用 if/else 或 switch/case 控制结构。将验证过程的大部分内容从内联代码中提取出来,并将其打包成函数或类方法(如果您正在使用 OOP)。
另请参阅有关 GOTO 的说明 ;-) http://xkcd.com/292/

0
PHP解释器将文件作为单个单位处理,<?php标签仅指定要忽略的文本部分(标签外),就像注释一样。标签不包含任何代码部分。 因此,在您的情况下,我认为goto语句可能是正确的选项。或者,如果您可以将代码放入一个函数中,您可以使用return

是的,从所有的解决方案中,我认为这个是最好的,将代码封装在一个函数内,然后使用 return 应该可以解决问题,但我会保留 if-else。谢谢! - Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接