2

注:出力バッファリングを使用しています。これは、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();
?>

基本的に、複数のタスクを含むスクリプトがあり、スクリプトの残りの部分が実行されないようにしながら、入力エラーをユーザーに通知する適切な方法を設定しようとしています。

ありがとう!

4

3 に答える 3

4

私はこれをします:

head();
try {
    somethingPossiblyWithError();
    somethingElse();
} catch (Exception $e) {
    handleError();
}
foot();

死は必要ありません。でエラーが発生した場合、はsomethingPossiblyWithErrorスキップsomethingElseされます。footどちらの場合も実行されます。

更新:あなたがそれについて考えていなかったと思うので、私はシュラプネル大佐の答えに賛成しました、そしてそれは貴重な知識です。PHPでは、値を明示的に渡さなくても、出力バッファリングによって同等の機能を取得できますが、それほどきれいではありません-ただし、値として出力せずに出力する関数を呼び出す場合は機能するため、次のような場合に便利です。知る。

于 2010-06-14T05:51:16.780 に答える
3

ページ構造全体が間違っています。
それは最も広範囲にわたる初心者の間違いですが。

すべてのデータを準備する前に、物を出力してはいけません。
スクリプトは、いくつかのHTTPヘッダーを送信したり、header()などで使用するためのいくつかの変数を設定したりする場合があります。

したがって、テンプレートの使用が必要です。
スクリプトを2つの部分に分割する必要があります。データ部分の取得とデータ部分の表示です。
したがって、header()関数をはるかに低く移動する必要があります。
そして、アマダンの答えに基づいて、それは可能性があります

<?php
include 'bootstrap.php';
try {
  getData();
} catch (Exception $e) {
    handleError();
}
head();
body();
foot();
?>

handleError()関数は、適切なHTTPエラーコード(404または500)を設定し、本文テンプレートをエラーメッセージテキストに置き換えることができます。

于 2010-06-14T07:11:24.113 に答える
1

多くの理由から、このアプローチはお勧めしません。あなたがすべき:

  • プレゼンテーションとロジックを分離します(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
          }
   }
 ...
}

これもお勧めしません(タスクごとに多くの個別のクラスが必要です)が、要点はわかります。すべてを混合するのではなく、分離することです。

于 2010-06-14T07:55:51.797 に答える