die()の適切な使い方は?
-
27-09-2019 - |
質問
注記: 出力バッファリングを使用しています。head() 関数と foot() 関数でラップされているだけです。
次のテンプレートを使用して、現在の PHP プロジェクトにページを作成します。
<?php
include 'bootstrap.php';
head();
?>
<!-- Page content here -->
<?php
foot();
?>
次の例は die() の適切な使用法ですか?また、これによりどのような問題が発生する可能性がありますか?
<?php
include 'bootstrap.php';
head();
try
{
//Simulate throwing an exception from some class
throw new Exception('Something went wrong!');
}
catch(Exception $e)
{
?>
<p>Please fix the following error:</p>
<p><?php echo $e->getMessage(); ?></p>
<?php
foot();
die();
}
//If no exception is thrown above, continue script
doSomething();
doSomeOtherThing();
foot();
?>
基本的に、複数のタスクを含むスクリプトがあり、スクリプトの残りの部分が実行されないようにしながら、入力エラーをユーザーに通知する適切な方法をセットアップしようとしています。
ありがとう!
解決
は、ページ全体の構造が間違っている。
それは最も普及している初心者の間違いだけれども。
一つは、すべてのデータの準備ができたの前に出力事でください。
あなたのヘッダーに使用するためにいくつかの変数を設定することもでき、いくつかのHTTPヘッダを送信することができ、スクリプト、()か何かます。
そのため、テンプレートの使用が必要である。
あなたは、2つの部分にあなたのスクリプトを分割する必要があります - 。データ部分を取得し、データの一部を表示する
だから、あなたははるかに低いヘッダ()関数を移動する必要があります。
そしてAmadanの回答に基づいてそれができる
<?php
include 'bootstrap.php';
try {
getData();
} catch (Exception $e) {
handleError();
}
head();
body();
foot();
?>
handleErrorの()関数は、エラー・メッセージ・テキストを適切なHTTPエラーコード(404または500)と代替ボディテンプレートを設定してもよい。
他のヒント
私だったらこうします:
head();
try {
somethingPossiblyWithError();
somethingElse();
} catch (Exception $e) {
handleError();
}
foot();
死は必要ありません。でエラーが発生した場合 somethingPossiblyWithError
, 、 それから somethingElse
スキップされてしまいます。 foot
どちらの場合でも実行されます。
アップデート: 私は大佐に賛成票を投じました。Shrapnel の答えは、あなたはそれについて考えていなかったのではないでしょうか。そして、それは貴重な知識です。PHP では、次の方法で同等の機能を得ることができます。 出力バッファリング, 明示的に値を渡しませんが、それほどきれいではありません。ただし、値として返さずに出力する関数を呼び出している場合には機能するため、知っておくと役立つ場合があります。
あなたのアプローチは多くの理由から推奨されません。あなたがすべき:
- プレゼンテーションとロジックを分離する (MVC パターンを見てください)
- 手続き型コードを避け、オブジェクト指向の PHP を作成する
- ユーザーと管理者のエクスペリエンスを分離する (エラーを優しく処理する)
上記を実装した例:
<? $page->debug = true; ?>
<?= $page->getHead(); ?>
<?= $page->getBody(); ?>
<?= $page->getFoot(); ?>
class page {
public debug;
public function getBody() {
try {
//
} catch (Exception $e) {
$this->_errorhandler('message');
}
}
protected function _errorhandler($message) {
if ($this->debug) {
// display error message
} else {
// display nothing, log the error
// or throw concrete exception
// or redirect
}
}
...
}
これも推奨されません (タスクごとに多くの個別のクラスが必要です) が、次の点はわかります。すべてを混ぜるのではなく、分離します。