(Yaf >=1.0.0)
Yaf_Loader は、 Yaf 用に包括的なオートローディング機能を導入します。
最初に Yaf_Application のインスタンスを取得するときに、 Yaf_Loader はシングルトンのインスタンスを作って それを spl_autoload に登録します。このインスタンスを取得するには Yaf_Loader::getInstance() を使います。
Yaf_Loader は、クラスのロードを一度だけ試みます。
失敗した場合の挙動は yaf.use_spl_auload
によって変わります。もしこの設定が On なら
Yaf_Loader::autoload() は false
を返し、
他のオートロード関数でやり直せるようになります。この設定が Off (デフォルト)
の場合は Yaf_Loader::autoload() が true
を返します。
そして、より重要なのは、このときに警告メッセージが出ることです
(このメッセージを見れば、なぜロードできなかったのかがわかります)。
注意:
yaf.use_spl_autoload はできるだけ Off のままにしておきましょう。 ただし、何かのライブラリが自前のオートロード機構を持っていて、 それを置き換えるのが不可能だという場合は別です。
デフォルトでは、Yaf_Loader はすべてのライブラリ (クラスを定義したスクリプト) が グローバル ライブラリディレクトリ に格納されているものとみなします。このディレクトリは、 php.ini (yaf.library) で指定します。
Yaf_Loader がクラス (ライブラリ) を探すときに ローカルクラスディレクトリ (application.ini で定義するもので、デフォルトは application.directory . "/library") も検索対象とさせたい場合は、クラスのプレフィックスを Yaf_Loader::registerLocalNameSpace() で登録する必要があります。
いくつか例を示します (APPLICATION_PATH は application.directory であるものとします)。
例1 設定の例
// php.ini で、これを設定しているものとします yaf.library = "/global_dir" // application.ini で、これを設定しているものとします application.library = APPLICATION_PATH "/library"
例2 localnamespace の登録
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
例3 クラスのロード
class Foo_Bar_Test => // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php
例4 名前空間つきのクラスのロード
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
すべてのフォルダの先頭が大文字になっているのが気になる場合は、php.ini で yaf.lowcase_path = On とすれば小文字にすることもできます。
Yaf_Loader は MVC クラスを読み込むようにも作られています。 次のような規約に従います。
例5 MVC クラスのロード
Controller Classes => // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/
例6 MVC クラスかどうかの区別
Controller Classes => // ***Controller Model Classes => // ***Model Plugin Classes => // ***Plugin
例7 MVC のロード
class IndexController // APPLICATION_PATH/controllers/Index.php class DataModel => // APPLICATION_PATH/models/Data.php class DummyPlugin => // APPLICATION_PATH/plugins/Dummy.php class A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php
また、ディレクトリは yaf.lowcase_path の影響を受けます。注意:
2.1.18 からは、Yaf はユーザースクリプト側からのコントローラのオートロードに対応しました (つまり、ユーザーが書いた PHP スクリプトからオートロードを実行できるということです。 ブートストラップやプラグインから、コントローラのstaticプロパティにアクセスできます)。 しかし、オートローダーがコントローラクラスを探す場所は、デフォルトのモジュールフォルダつまり "APPLICATION_PATH/controllers/" だけになります。
デフォルトでは、この値は application.directory . "/library" となります。この値を変更するには、application.ini (application.library) で設定するか、あるいは Yaf_Loader::setLibraryPath() をコールします。