Как я могу отобразить статический HTML после того, как я использовал die() в блоке PHP?
Допустим, у меня есть такой код:
<html>
<head><title>Title</title></head>
<body>
<?php
if (!$someCondition){
die();
}
else{
#Do something
}
?>
</body>
<html>
Я надеюсь, что цель этого кода проста. Если определенное условие выполнено (то есть не может подключиться к базе данных), то программа должна умереть, но в противном случае она должна выполняться. Моя проблема возникает при выполнении функции die(). Он останавливается прямо здесь и отправляет в браузер только первые три строки, но не последние две строки.
Есть ли функция, которую я могу использовать вместо die(), чтобы блоки php перестали выполняться, но статический HTML-текст по-прежнему передается через?
10 ответов
Вы должны разделить верхний и нижний колонтитулы на отдельные файлы и функции. Это значительно упрощает поддержку пользовательского интерфейса и обеспечивает согласованность при отображении представления. Соедините это с использованием обработки исключений, и вы получите отличную оценку.
<?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
?>
Отделите логику вашей программы от презентации. Читайте про 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();
Хотя я рекомендую использовать это только для диагностики / отладки.
Передайте кубу параметр статического текста.
Например, измените это:
<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>
Я бы, вероятно, использовал исключения. Оберните все в блок try / catch, а затем создайте новое исключение в случае ошибки, например, сбоя базы данных. Вы ничего не могли бы сделать в блоке catch (как пустой метод die()), но было бы лучше представить здесь сообщение об ошибке пользователю.
Вот довольно хорошее руководство по обработке исключений в PHP5 на тот случай, если вы с ними не знакомы или вам нужно разобраться с тем, что изменилось с PHP4.
<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
Если вы работаете с PHP4 или просто не хотите беспокоиться об исключениях, вы можете использовать эту технику:
<html>
<head><title>Title</title></head>
<body>
<?php
do {
if (!$someCondition){
break;
} else {
#Do something
}
} while (0);
?>
</body>
<html>
... хотя некоторые люди, кажется, весьма против использования этого стиля, прокомментированы соответствующим образом, я не вижу никаких проблем с ним. Я бы сказал, что это гораздо лучше, чем дублировать код "нижнего колонтитула" в каждом из ваших операторов die().
Вы смотрели на использование register_shutdown_function
(php.net) завершить загрузку страницы? Это должно быть в состоянии справиться die()
а также exit()
,
die()
может быть не совсем то, что вы хотите здесь. Почему бы не заменить
if (!$someCondition) {
die();
} else {
/* do stuff */
}
с
if ($someCondition) {
/* do stuff */
} else {
/* output error message/redirect/output nothing/whatever */
}
или бросить / поймать исключение?
Один метод, который работает, но не совсем то, что я ищу, это заменить die()
с die("</body></html>")
, Если возвращаемый текст был более сложным, чем это, он мог бы, скажем, быть сохранен в переменной. Есть ли что-нибудь лучше, чем это?
Если вы посмотрите на документацию PHP, вы увидите, что "Эквивалент к выходу ()" - то есть вызов его завершает вашу программу и на самом деле не дает вам большого шанса что-либо сделать. Даже за пределами ZF не так уж много можно сделать, когда приложение умирает (). Решение состоит в том, чтобы использовать исключения.
Необработанное исключение по сути то же самое, что и die() (кроме генерируемой трассировки стека). Исключением является возможность поместить его в блок try/catch, что дает вам возможность исправить ошибку и продолжить работу с программой (или отобразить дружественное сообщение об ошибке и сгенерировать журнал). Предполагая, что вы используете Zend_Controller_Front, вы можете проверить быстрый старт Zend Framework, чтобы увидеть, как они создают обработчик ошибок по умолчанию, который будет перехватывать необработанные исключения и отображать соответствующее сообщение об ошибке.