1

私はOOPに少し慣れていないので、自分のアプリケーションの「フレームワーク」に取り組んでいます。以下のような独自の自動ロード関数と、例外処理オブジェクトがあります。サードパーティのプラグインは使用しません(少なくとも私は思いません)。

最初の質問:オートロードで例外処理を気にする必要がありますか、それとも単にやり過ぎですか?

2番目の質問:私のexceptionHandlerクラスはパブリック関数です...他の多くのアプリケーションで使用されるものなので、これは正しいですか?ありがとうございました。

ありがとう..どんな入力でも大歓迎です。

function __autoload( $class ){

    // Define filename pattern to include
    $filename = $_SERVER['DOCUMENT_ROOT'] . '/../app/core/models/' . $class . '.class.php';

    // Require class if it exists
    try {

        if ( is_readable( $filename ) ) {

            require_once ( $filename );
        }
        else {

            throw new Exception( "Class filename doesn't exist or isn't named correctly: $filename" );
        }
    }
    catch ( Exception $e ) {

        // Send to exceptionHandler Class for logging/handling.
        $err = new exceptionHandler( $e, 3 );
    }
}

4

3 に答える 3

0

自動ロード関数は、実際には例外をスローすることを意図していません。その例外がどこで発生するかが明確ではなく、コード全体をtry catchブロックでラップするか、例外ハンドラーを定義する必要があるためです。

エラーをトリガーするtrigger_errorか、PHPに、エラーが発生した実際の行にロードできないクラスを通知させる必要があります(したがって、存在しないファイルは無視します)。

また、使用するべきではありません__autoloadspl_autoload_register

于 2013-02-24T18:27:33.987 に答える
0

あなたの最初の質問に関して:いいえ、あなたはすべきではありません。

最初の理由:常に複数のオートローダーをチェーンできる必要があります(を参照spl_autoload_register)。したがって、1つのオートローダーに障害が発生した場合、2番目のオートローダーがそのクラスをロードできる可能性があります。このため、何をしているのかを正確に理解していない限り、オートローダーはエラーをスローしないはずです。

2番目の理由:すべての自動読み込みの試行が失敗した場合、phpはとにかくエラーをトリガーします。PHPエラーを適切に記録すれば、オートローダーにこれを記録する必要はありません。

3番目の理由:オートローダーは、大量に実行されるコードの一部になります。ここでは、try/catchブロックは必要ありません。

それとは別に:自動ロードexceptionHandlerが失敗した場合はどうなりますか...?

于 2013-02-24T18:38:48.863 に答える
0

フィードバックをありがとうジェフリーとアレクサンダー。あなたたちは私に考えさせました..私はより簡単な(そしてより速い?)方法のために私の自家製のオートローダーを削除することになりました...

構成ファイルに、コアアプリケーションクラスとモジュールクラスのインクルードパスを追加しました。

set_include_path( get_include_path() . PATH_SEPARATOR . APPLICATION_ROOT . 'core' . DIRECTORY_SEPARATOR . PATH_SEPARATOR . APPLICATION_ROOT . 'module' . DIRECTORY_SEPARATOR );
spl_autoload_extensions( '.class.php' );
spl_autoload_register();

これまでのところそれは動作します:)

于 2013-02-26T01:37:44.760 に答える