假设我有一些像这样的代码:
<html>
<head><title>Title</title></head>
<body>
<?php
if (!$someCondition){
die();
}
else{
#Do something
}
?>
</body>
<html>
我希望这段代码的目的很简单。如果满足某个条件(即无法连接到数据库),那么程序应该死掉,否则它应该执行。执行die()函数时出现问题。它在那里停止正确,并且只将前三行发送到浏览器,而不是最后两行。
是否有一个功能,我可以使用而不是die(),以便php块将停止执行,但静态HTML文本仍然通过?
答案 0 :(得分:7)
将程序逻辑与演示文稿分离。阅读MVC,模板。
最简单的形式就是这样:
<?php
function logic() {
if (!$someCondition) {
return 'display_empty_page';
} else {
return 'display_other_stuff';
}
}
presentation(logic());
对于其他情况,die()
或其他情况不可避免(例如致命错误或第三方代码死亡),有涉及输出处理程序的黑客攻击:
ob_start('myhandler');
function myhandler($page) {return $page.' extra markup';}
die();
虽然我建议仅将其用于诊断/调试目的。
答案 1 :(得分:2)
您应该将页眉和页脚分隔成单独的文件和函数。这使得UI更易于维护,并使呈现视图的内容保持一致。结合使用Exception handling并且你是金色的。
<?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
?>
答案 2 :(得分: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>
答案 3 :(得分:1)
我可能会使用例外。将所有内容包装在try / catch块中,然后在数据库失败等错误情况下抛出新异常。你可以在catch块中做任何事情(就像一个空的die()方法),但最好在这里向用户提供一条错误信息。
如果您不熟悉PHP5中的异常处理,那么这里有一个pretty good guide,或者您需要了解自PHP4以来的更改。
答案 4 :(得分:0)
一种方法可行,但不是我正在寻找的方法,将die()
替换为die("</body></html>")
。如果要返回的文本比这更复杂,那么它可以存储在变量中。还有什么比这更好的吗?
答案 5 :(得分:0)
die()
可能不完全是你想要的。为什么不替换
if (!$someCondition) {
die();
} else {
/* do stuff */
}
带
if ($someCondition) {
/* do stuff */
} else {
/* output error message/redirect/output nothing/whatever */
}
或抛出/捕获异常?
答案 6 :(得分:0)
您是否考虑过使用register_shutdown_function
(php.net)来完成加载页面?它应该能够处理die()
和exit()
。
答案 7 :(得分:0)
如果你看the PHP Documentation,你会看到“相当于退出()” - 即调用它会终止你的程序,并没有给你很多机会做任何事情。即使在ZF之外,当应用程序die()时,你也无法做很多事情。解决方案是使用例外。
未捕获的异常与die()基本相同(除了生成的堆栈跟踪之外)。异常给你的是能够将它放在try / catch块中,让你有机会纠正错误并继续使用程序(或显示友好的错误消息并生成日志)。假设您正在使用Zend_Controller_Front,您可以查看Zend Framework Quickstart以查看它们如何创建一个默认错误处理程序,以捕获未捕获的异常并显示相应的错误消息。
答案 8 :(得分:0)
如果你正在使用PHP4,或者只是不想打扰异常,那么你可以使用这种技术:
<html>
<head><title>Title</title></head>
<body>
<?php
do {
if (!$someCondition){
break;
} else {
#Do something
}
} while (0);
?>
</body>
<html>
..虽然有些人似乎非常反对使用这种风格,但有适当的评论,我认为没有任何问题。我说这比在每个die()语句中复制你的“页脚”代码要好得多。
答案 9 :(得分: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>
header
echo $_GET[$error_message];
footer