有没有替代方案来替代“die”?

6
抱歉标题听起来有些夸张,只是想知道是否有一种方法可以防止执行所有类型的PHP命令,除了一个。

例如,现在当我使用die()杀死脚本时,我的页面看起来半毁不成,因为页面底部的HTML未能加载,因为它是通过include()函数引入的。

那么有没有办法告诉PHP“不要再执行任何命令,除了include函数”?

1
也许 die() 不是正确的命令。什么是上下文?为什么您需要终止脚本? - Felix Kling
不,如果是你的时间,你只需要“死”...抱歉。 :) 但说真的,看起来你的做法有些错误。不要在页面仍在执行任务时杀掉它。使用更好的错误处理方法! - deceze
@Felix Kling 如果GET参数的值不是3个预定的可接受值之一,出于安全原因,我将终止脚本的运行。 - TJDeatwiler
1
从建筑物顶部跳下来,开枪自杀,喝油,从飞机上跳下来,但没有降落伞。 - Delta
你应该在输出任何内容之前完成所有的处理。 - Casey Chu
6个回答

12

你可以使用return来"终止"一个被包含的文件,而不会结束整个脚本:

test1.php

<?php
include 'test2.php';
echo 'foo';

test2.php

<?php
echo 'bar';
return;
echo 'baz';

输出:

barfoo

继续脚本的有用方法。只需以任何你喜欢的方式处理返回的内容,谢谢。 - Andrew

2

您需要使用自定义的die()命令,例如my_die(),以包含所需的文件。您不能覆盖die(),也不会有任何其他函数允许您做您所寻求的事情。


1

exit()函数将停止执行,并运行任何已注册的退出处理程序。

抛出异常将一直上升到周围try的位置。如果没有try到达顶层,则会终止脚本的所有执行。

在全局范围内使用return将从当前包含文件返回,回到包含/需要文件的内容。

个人建议采用深思熟虑的异常处理方法,并使用try / throw。


0

你为什么不能直接这样做呢?

if(something didn't work) {
  include('footer.php');
  die();
}

如果你经常使用它,把它变成一个函数。
function finish_and_die($message) {
  print $message;
  include('footer.php');
  exit;
}

没有,因为我在页面的不同级别中有多个包含文件,并且处理部分在中间,如果有另一种方法,我就不想担心顺序。 - TJDeatwiler

0
你可以尝试这样做:
if( is_secure($_GET['value']) ) // Whatever you're using to check if the value is allowed
{
    // Page content goes here
}

这样,所有其他的包含和页面处理代码仍将被调用。

或者,如果它无效,则抛出异常,并有一个异常处理程序,知道如何完成页面代码。


-1
如果您使用面向对象编程(OOP)的方法结合输出缓冲,这是您可以解决问题的方式:
Controller类(包含逻辑的地方)有一个成员变量,它是Template类的一个实例。 Controller类有一个__destruct方法,用于渲染Template。
当调用exit()或die()时,Controller对象的__destruct方法被调用,进而调用Template对象的render方法。

1
业务逻辑应该放在控制器中。存储/数据逻辑应该放在模型中。显示逻辑应该放在视图中。 - Stephen
有趣的是,这就是我刚刚构建模板渲染框架的方式。 :) - Spechal
2
很抱歉,不行。业务逻辑绝对应该放在模型中。控制器是业务逻辑(模型)和显示(视图)之间的桥梁。搜索一下,你就会看到。这里有一个例子。数据逻辑到底是什么?对我来说,它只是另一种说法的业务逻辑。 - netcoder
当然,严格来说,“业务逻辑”应该在模型中。但是根据我的经验,通常情况下,模型仅定义数据结构以及如何存储/检索数据,而验证和更高级别的逻辑(例如谁可以访问指定的对象)通常在控制器中处理。这就是为什么我区分“业务逻辑”和“数据逻辑”的原因 - 也许更好地表示为“业务逻辑”放在模型中,“应用程序逻辑”放在控制器中。 - Stephen

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