コード例
<ol class="dp-c"> <li class="alt"><span><span>set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path()); </span></span></li> <li><span><span class="keyword">require_once</span><span> </span><span class="string">'Zend/Loader/Autoloader.php'</span><span>; </span></span></li> <li class="alt"><span><span class="vars">$autoloader</span><span> = Zend_Loader_Autoloader::getInstance(); </span></span></li> <li><span><span class="vars">$autoloader</span><span>->registerNamespace(</span><span class="string">"Zend_"</span><span>); </span></span></li> <li class="alt"><span><span class="vars">$autoloader</span><span>->registerNamespace(</span><span class="string">"USVN_"</span><span>); </span></span></li> <li><span><span class="vars">$autoloader</span><span>->registerNamespace(</span><span class="string">"menus_"</span><span>); </span></span></li> <li class="alt"><span><span class="vars">$config</span><span> = </span><span class="keyword">new</span><span> USVN_Config_Ini(USVN_CONFIG_FILE, USVN_CONFIG_SECTION); </span></span></li> </ol>
プロセス分析
まず、phpでincludeを呼び出す際にファイルを検索するアドレスであるinclude_pathを設定します
以下はrequire_once 'Zend/Loader/Autoloader.php';
In Zend/Loader /Autoloader.php ファイルでは、Zend/Loader.php が読み込まれます。この php には、loadClass、loadFile、isReadable (ファイルが読み取れるかどうか) などの関数が含まれています。 Zend_Loader_Autoloader をインスタンス化するには、関数のコンストラクターで spl_autoload_register(array(__CLASS__, 'autoload')); を呼び出します (ここでは、シングルトン モードが使用されます)。 _internalAutoloaderを独自の_autoloadに代入する操作も行いました
ここでのオートロードのやり方については、具体的な例を元に確認していきます
次に、この関数が何をしているのかというと、 Zend_Loader_Autoloader:registerNamespace("USVN_") です。 Zend_Loader_AutoLoader の内部属性 _namespaces にキー USVN_ と値 true の値をマウントするだけです。
この関数を見ると、コードが
$autoloader->registerNamespace("Zend_")->registerNamespace("USVN_")
または
$autoloader-> としても記述できることがわかります。 ;registerNamespace(array(" Zend_","USVN_"))
さて、USVN_Config_Ini クラスを呼び出します
このクラスは当然 Zend_Loader_Autoloader:autoload("USVN_Config_Ini") を呼び出します。 getClassAutoloaders は、このクラスの AutoLoader を取得します。 GetClassAutoloaders は、namespaceAutoloader の選択と判定を追加します。めったに使用しないため、ここではリターンローダーをスキップして、次のように出力します
Array ( [0] => Zend_Loader_Autoloader Object ( [_autoloaders:protected] => Array ( ) [_defaultAutoloader:protected] => 配列 ( [0] => Zend_Loader [1] =>loadClass ) [_fallbackAutoloader:protected] => 配列 *RECURSION* [_namespaces :protected] => 配列 ( [Zend_] => 1 [ZendX_] => 1 [USVN_] => 1 [menus_] => 1 ) [_namespaceAutoloaders:protected] => 配列 ( ) [_suppressNotFoundWarnings :protected] => [_zfPath:protected] => ) [1] => _autoload )
は、実際には前に設定した _internalAutoloader です。
Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini") は実際にここで呼び出されます
さて、Zend_Loader_Autoloader:_autoload 関数が表示されました
$callback = $this->getDefaultAutoloader();
デフォルトのオートローダーはここで取得されます、デフォルトのオートローダーは何ですか? このクラスの初期定義を見ると、実際には array('Zend_Loader', 'loadClass'); です
以下の自然な呼び出しは call_user_func($callback, $class); です。 :loadClass(" USVN_Config_Ini")
まず、AutoLoader.php では Zend_Loader が必要です
次に、Zend_Loader:loadClass メソッドを見てみましょう。このメソッドの最初のステップは、例外をチェックしてスキップすることです。 。 2 番目のステップは、クラスを分離し、USVN/Config/Ini.php などの $file に結合することです。次に、self::loadFile($file, null, true);
を直接呼び出します。次に、self を確認します。 :loadFile。最初の _securityCheck は、クラス名に不正な文字が含まれているかどうかをチェックします。含まれていない場合は、$file が含まれます。もちろん、ここでの $file は相対パスであり、include_path がどこに設定されているか覚えていますか?プログラムの最初に設定してください。さて、これが読み込まれた USVN_Config_Ini クラスです。
これを見れば分かると思いますが、自分でクラスを定義して、USVNなどのNamespaceを登録する場合は、include_pathの下に同じ名前のフォルダを作成して(大文字と小文字を区別する必要があります)、インポートする必要があります。相対ファイルパス名はクラス名の_で区切られて読み取られます。
これで AutoLoad メカニズムの説明は終わりです。