PHP Conference Nagoya 2025

Yaf_Loader クラス

(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/
クラスのサフィックス (デフォルト設定の場合。プレフィックスを使うには yaf.name_suffix の値を変更します) で、MVC クラスであるかそうでないかを判断します。

例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

注意:

2.1.18 からは、Yaf はユーザースクリプト側からのコントローラのオートロードに対応しました (つまり、ユーザーが書いた PHP スクリプトからオートロードを実行できるということです。 ブートストラップやプラグインから、コントローラのstaticプロパティにアクセスできます)。 しかし、オートローダーがコントローラクラスを探す場所は、デフォルトのモジュールフォルダつまり "APPLICATION_PATH/controllers/" だけになります。

また、ディレクトリは yaf.lowcase_path の影響を受けます。

クラス概要

class Yaf_Loader {
/* プロパティ */
protected $_local_ns;
protected $_library;
protected $_global_library;
static $_instance;
/* メソッド */
private __construct()
public autoload(): void
public static getInstance(): void
public getLibraryPath(bool $is_global = false): Yaf_Loader
public getNamespacePath(string $namespaces): string
public getNamespaces(): array
public static import(): void
public isLocalName(): void
public registerNamespace(string|array $namespaces, string $path = ?): bool
public setLibraryPath(string $directory, bool $is_global = false): Yaf_Loader
}

プロパティ

_local_ns

_library

デフォルトでは、この値は application.directory . "/library" となります。この値を変更するには、application.ini (application.library) で設定するか、あるいは Yaf_Loader::setLibraryPath() をコールします。

_global_library

_instance

目次

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top