MVCのパラダイムをより深く理解するために、私自身のフレームワークを構築することを試しています。カスタムspl_autloader関数からエラーをキャプチャする最良の方法
エラーが発生したインクルードの結果であるPHPの醜いエラー/警告に頼るのではなく、スタックトレースとともにデータをより人間が読める形式で表示する一般的な例外クラスを設定します。
ここで私はこれまで...
spl_autoload_register(__NAMESPACE__.'\Autoloader::coreLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::appLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::throwException');
class Autoloader
{
private static $isError = false;
private static function loadHelper($className)
{
//Relevant code here
}
public static function coreLoader($className)
{
$classPath = static::loadHelper($className);
if ([email protected] PRIVATE_ROOT.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function appLoader($className)
{
$classPath = static::loadHelper($className);
if ([email protected] SYSTEM_PATH.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function throwException($className)
{
if (static::$isError)
{
throw new Exception_General('Attempted to load file: '.$className);
}
}
}
は、ファイルが見つからない場合include
が例外を生成しない、私はtry/catchブロックを使用することができないという事実を考えるとしているコードです。
try/catchブロックの代わりに、上記のコードのようにif statement
を使用して、include
ステートメントが必要なファイルのロードに成功したかどうかを確認できます。
私のException_General
クラスは、開発者に便利なエラー出力/メッセージの生成と表示を担当します。私がここで直面する問題は、正当なオートローディング方法の中で例外をスローすると、スクリプトが正当に停止するということです。
最初の自動ロードメソッドが要求されたクラスを見つけられないかもしれないが、spl_autoloadキューの2番目または3番目のオートロードメソッドが要求されたファイル/クラスを見つけることができるので、これは理想的ではない。
この動作に対応するために、キュー内で最後に呼び出される第3の「偽の」オートロードメソッドを作成しなければならないことがわかりました。このメソッドはエラーフラグをチェックし、例外がスローされます。
私が本当に求めているのは、失敗したインクルードを取り込むための良い方法があり、すべてのオートローディング機能がそのコースを実行したら、適切に動作するかどうかです。
私は複数のオートローダーのルートを選択した理由の1つは、パフォーマンス/速度によるものです。1つのautoload関数のみを使用し、その関数内でクラス名文字列を解析/照合するルートに進むと、例外を含むことができるので、例外をスローすることに問題はありません。このアプローチの欠点は、単純にクラスをロードするために多くの処理能力を発揮することです。複数のオートローダーでは、各オートローダーがクラス/パスの特定のセグメントを担当するため、処理があまり行われません。 – cgons
あなたはもちろんそうです。あなたが言うように、各クラスを見つけるオーバーヘッドはかなり高いので、プロダクション環境で使用するとは思えません。これは、すべてのコールバックが失敗した場合(つまり、「Autoloader」の後に追加されたものであっても)、例外がスローされることを確実にするというアイデアによって、多かれ少なかれ動いていました。私がそれを投稿したときの私の就寝時間をはるかに過ぎた)。 – connec