die()をPHPブロックで使用した後に静的HTMLを表示する方法はありますか
質問
次のようなコードがあるとします:
<html>
<head><title>Title</title></head>
<body>
<?php
if (!$someCondition){
die();
}
else{
#Do something
}
?>
</body>
<html>
このコードの目的が簡単であることを願っています。特定の条件が満たされた場合(つまり、データベースに接続できない場合)、プログラムは終了しますが、それ以外の場合は実行されます。 die()関数を実行すると、私の問題が発生します。そこで right を停止し、最初の3行のみをブラウザに送信し、最後の2行は送信しません。
die()の代わりに使用できる機能があり、phpチャンクの実行を停止できますが、静的なHTMLテキストは引き続き送信されますか?
解決
ヘッダーとフッターを別々のファイルと関数に分離する必要があります。これにより、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
?>
他のヒント
プレゼンテーションからプログラムロジックを分離します。 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; exit()<!> quot; -つまり、それを呼び出すと、プログラムが終了し、実際に何もする機会がほとんどなくなります。 ZF以外でも、アプリケーションが終了したときにできることはあまりありません。解決策は、例外を使用することです。
キャッチされない例外は、本質的にdie()と同じものです(生成されるスタックトレースを除く)。例外が提供するのは、try / catchブロックに入れて、エラーを修正し、プログラムを続行する(またはわかりやすいエラーメッセージを表示してログを生成する)機会を与えることです。 Zend_Controller_Frontを使用していると仮定すると、 Zend Frameworkのクイックスタートをチェックして、それらの作成方法を確認できます。キャッチされない例外をキャッチし、適切なエラーメッセージを表示するデフォルトのエラーハンドラ。
1つの方法は機能しますが、正確には探しているものではありませんが、die()
をdie("</body></html>")
に置き換えることです。返すテキストがそれよりも複雑な場合、たとえば、変数に格納できます。これより良いものはありますか?
die()
は、ここで必要なものではない場合があります。置換しない理由
if (!$someCondition) {
die();
} else {
/* do stuff */
}
with
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