1

假设我有一些这样的代码:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

我希望这段代码的目的很简单。如果满足某个条件(即无法连接到数据库),那么程序应该死掉,否则它应该执行。我的问题是在执行 die() 函数时出现的。它停在那里只将前三行发送到浏览器,而不是最后两行。

有没有我可以使用的函数来代替 die() 以便 php 块将停止执行,但仍然发送静态 HTML 文本?

4

10 回答 10

8

将您的程序逻辑与表示分离。阅读有关 MVC、模板的信息。

最简单的形式是这样的:

<?php
function logic() {
    if (!$someCondition) {
        return 'display_empty_page';
    } else {
        return 'display_other_stuff';
    }
}

presentation(logic());



对于其他die()不可避免的情况(例如致命错误或第 3 方代码死亡),存在涉及输出处理程序的 hack:

ob_start('myhandler'); 
function myhandler($page) {return $page.' extra markup';}
die();

尽管我建议仅将其用于诊断/调试目的。

于 2008-11-20T23:58:59.870 回答
2

您应该将页眉和页脚分离到单独的文件和函数中。这使得 UI 更容易维护,并保持渲染视图的一致性。将其与使用异常处理结合起来,您就很成功了。

<?php

printHeader(); // outputs the html header
try
{
    if (some condition)
    {
        throw new Exception("It Died...");
    }
    // More processing here that should not execute if the above condition is true
    // ...
}
catch (Exception e)
{
    echo $e->getMessage();
}
printFooter(); // outputs the html footer

?>
于 2008-11-21T00:03:28.300 回答
2

将静态文本的参数传递给 die。

例如改变这个:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

对此:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die("OMG RED ALERT!!!!</body></html>");
}
else{
  #Do something
}
?>
</body>
<html>
于 2008-11-21T00:14:03.770 回答
1

我可能会使用例外。将所有内容包装在一个 try/catch 块中,然后在数据库故障等错误条件下抛出一个新异常。你可以在 catch 块中什么都不做(比如一个空的 die() 方法),但是在这里向用户显示一条错误消息会更好。

如果你不熟悉它们或者你需要复习自 PHP4 以来的变化,这里有一个关于 PHP5 异常处理的非常好的指南。

于 2008-11-20T23:53:30.020 回答
0

一种有效但不完全是我正在寻找的方法是替换die()die("</body></html>"). 如果要返回的文本比这更复杂,则可以将其存储在变量中。还有什么比这更好的吗?

于 2008-11-20T23:48:54.680 回答
0

die()可能不是你想要的。为什么不换

if (!$someCondition) { 
    die();
} else {
    /* do stuff */
}

if ($someCondition) {
    /* do stuff */
} else {
    /* output error message/redirect/output nothing/whatever */
}

或抛出/捕获异常?

于 2008-11-20T23:55:37.427 回答
0

您是否考虑过使用register_shutdown_function(php.net) 来完成页面加载?它应该能够处理die()exit()

于 2008-11-21T00:18:43.760 回答
0

如果您查看PHP 文档,您会看到“等效于 exit()”——即调用它会终止您的程序,并且实际上并没有给您太多做任何事情的机会。即使在 ZF 之外,当应用程序 die()s 时,您也无能为力。解决方案是使用异常。

未捕获的异常本质上与 die() 相同(生成的堆栈跟踪除外)。异常为您提供的是将其放入 try/catch 块中的能力,使您有机会更正错误并继续执行程序(或显示友好的错误消息并生成日志)。假设您正在使用 Zend_Controller_Front,您可以查看Zend Framework Quickstart以了解他们如何创建一个默认错误处理程序,该处理程序将捕获未捕获的异常并显示适当的错误消息。

于 2008-11-21T00:53:06.513 回答
0

如果您正在使用 PHP4,或者只是不想打扰异常,那么您可以使用这种技术:

<html>
<head><title>Title</title></head>
<body>

<?php
do {
    if (!$someCondition){
          break;
    } else {
          #Do something
    }
} while (0);
?>
</body>
<html>

.. 虽然有些人似乎很反对使用这种风格,但适当地评论说,我认为它没有任何问题。我想说这比在每个 die() 语句中复制“页脚”代码要好得多。

于 2008-11-21T02:10:15.283 回答
0
<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
header ("location:error_page.php?erro_message='This error occured'");

  die();
}
else{
  #Do something
}
?>
</body>
<html>

error_page.php

header
echo $_GET[$error_message];
footer
于 2013-06-24T13:50:57.823 回答