2011-12-13 5 views
15

これまでは手続き型のスタンドアロンオートローダー関数を使用して、spl_autoload_register()という名前で登録して、(通常は)名前空間を持つクラスを自動的に読み込みました。最近、私は、オートローダクラスの使用について、注目すべきPHPフレームワークのいくつかと関連している人に気付きました。PHPオートローダークラスと手続き型オートローダー関数

最近、私のコードのほとんどはオブジェクト指向ですが、このインスタンスでは基本的な機能よりもクラス「オートローダー」を使用する利点はありません。また、テスト容易性の面では、私のテストでclass_exists()チェックを使用して、手続き関数がファイルを正しくロードするかどうかを確認するのが得策です。

だから私の質問は3です:物事をリファクタリングするために私に動揺し、自動ロードクラスファイルに本格オブジェクトを使用して開始する可能性がありますどのような利点や機能(もしあれば)

  1. 明白なOOP機能の外に、ここでいくつか目立つ利点がありませんか?
  2. 手続き型またはクラスオートローダのケースを作成してください。以下は

UPDATE

私が採用可能性がある典型的な自動ロード機能のためのいくつかのサンプルコードです。メタコードなので、タイプミスはしないでください。私は、彼らの名前空間を反映するように私のディレクトリ構造を整理します。仮想的なexplode_namespaces()関数は、理論的には静的メソッドとして静的メソッドとして、クラス内に静的メソッドとして含めることができるので、その利点の1つです。これらの異種の「ユーティリティ」関数を単一のクラスのメソッドとして結合する方がよりクリーンかもしれません。

function autoload($class_name) 
{ 
    $root = APP_LIBS; // a directory path constant set at config time 

    if ($namespaces = explode_namespaces($class_name)) { 

    $domain = array_shift($namespaces); 
    $root .= "/$domain/"; 

    $class_name = array_pop($namespaces); 
    $directories = array(); 

    foreach ($namespaces as $directory) { 
     $directories[] = $directory; 
    } 
    $root .= implode($directories, '/'); 
    } 

    $file = "$root/$class_name.php"; 
    if (file_exists($file)) { 
    include $file; 
    } 
} 
+0

本当に質問とは関係がないので、質問から「回答」部分を削除しました。あなた自身の答えを追加することを検討する必要があります、それは他の人に役立つ可能性があります:) – James

答えて

4

メソッドとメソッドを比較しています。それは構文的な砂糖です。

マップベースのオートローダーがある場合や、依存関係テーブルが組み込まれている場合を除いて、クラスレベルの属性は必要ありません(そうでない場合は静的またはグローバル変数に頼る可能性があります)。実行時の再構成可能性は実際には必要不可欠ではありません。

定数を使用してプロジェクトオートローダーをプロジェクト構成可能にすることができます。コンストラクタープロパティーを持つことは、メソッド実装で再利用することのメリットはあまりありません。少し上手く見えるかもしれません。

0

それは本当に重要ではありませんあなたはすでにフレームワークの他の主要な部分を使用する場合は、事前に作成いずれかを使用し、他の賢明。

複数の名前空間/ディレクトリが登録されている1つの自動ローダーを使用すると、メモリがわずかに削減されますが、それは本当に懸念事項ではありません。

+0

お返事ありがとうございます。私は前記のフレームワークを使用しません。私は一般的に様々なフレームワークから私のお気に入りの機能を選んでチェリーを好むし、私は "あなたはフレームワークを使用する必要があります"議論:)を持っていないよまた、私は現在、1つのオートローダーを使用しています..サンプルコード。 – rdlowrey

関連する問題