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