php autoloadノート

2255 ワード

php auotloadはクラスの遅延ロードメカニズムを実現し,必要に応じてincludeでは普段あまり使われない.その実現原理は以下の通りである(本人の研究の結果ではない):
  • エグゼクティブグローバル変数関数ポインタautoload_をチェックfuncがNULLかどうか.
  • autoload_func=NULLの場合、システムに_が定義されているかどうかを検索します.Autoload()関数は、ない場合はエラーを報告して終了します.
  • 定義されている場合Autoload()関数は、__を実行します.Autoload()はクラスのロードを試み、ロード結果を返します.
  • autoload_funcがNULLでない場合はautoload_を直接実行しますfuncポインタが指す関数は、クラスをロードするために使用されます.この時点ではチェックしないことに注意してください_Autoload()関数が定義されているかどうか.

  • PHPは自動マウントメカニズム、phpのautoloadを実現する2つの方法を提供し、もう1つは関数を設計し、autoload_をfuncポインタはそれを指し、これは通常C言語を使用してPHP拡張で実現される.既に実現している場合Autoload()関数、またautoload_を実現しましたfunc(autoload_funcをあるPHP関数に指す)では、autoload_のみが実行されます.func関数.
    phpのautoloadはあまり柔軟ではなく、1つのプロジェクトは1つしかありません!多様な自動ロードメカニズムを実現するにはautoloadが長く、メンテナンスが不便です.そこでSPL autoload phpの拡張がありました.
    class Tool 
    {
        public static function auto($class)
        {
            $filename = $class.'.php';
            require $filename;
        }
    }
    
    spl_autoload_register(array('Tool','auto'));
    spl_autoload_register(array('Kohana', 'auto_load'));

    複数のautoloadを登録できますが、前のロードができず、次の検索から検索されます.
      spl_autoload_call自体の実装は簡単ですが、このチェーンテーブルの各関数を簡単に順番に実行し、各関数の実行が完了した後、必要なクラスがロードされたかどうかを判断し、ロードに成功したら直接戻り、チェーンテーブルの他の関数を実行しません.このチェーンテーブルのすべての関数が実行された後にクラスがロードされていない場合、spl_autoload_callは直接終了し、ユーザーにエラーを報告しません.そのため、autoloadメカニズムを使用すると、クラスが必ず正しく自動的にロードされることを保証することはできません.肝心なのは、自動ロード関数がどのように実現されるかによって決まります.
      spl_autoload_register関数は、ユーザー定義の自動ロード関数をこのチェーンテーブルに登録し、autoload_func関数ポインタはspl_を指すautoload_コール関数.spl_を通過することもできますautoload_unregister関数autoload_から登録された関数をfunctionsチェーンテーブルから削除