クラスのオートロード

オートロードを利用しない場合

<?php
include_once('Foo.php')
$foo = new Foo();
  • 以上のようにnew Fooする前にFooクラスを定義したファイルのパスをinclude_once()で指定する必要がある。

__autoload()を使ってクラスをオートロードする

<?php
function __autoload($name) {
   $file = "${name}.php";
   if (is_readable($file)) {
       include_once($file);
   }
}

$foo = new Foo();
$bar = new Bar();
$baz = new Baz();
  • __autoload()関数を定義して、任意のクラスを定義したファイルをinclude()できるようにしておく。
  • これによってnew Foo()すればFoo.phpが、new Bar()すればBar.phpが自動的にinclude()されて便利。
  • ただし、この機能はdeprecateで非推奨になっているので、もう使わない方がよい。

spl_autoload_register()を使ってクラスをオートロードする

<?php
function load($name) {
    echo "load($name) was called\n";
    if (is_readable("lib/$name.php")) {
        include_once("lib/$name.php");
    }
}
class Bar {
    static function load($name) {
        echo "Bar::load($name) was called\n";
        if (is_readable("$name.php")) {
            include_once("$name.php");
        }
    }
}
class Baz {
    static function load($name) {
        echo "Baz::load($name) was called\n";
        if (is_readable("ext/$name.php")) {
            include_once("ext/$name.php");
        }
    }
}

spl_autoload_register('load');
spl_autoload_register('Bar::load');
$baz = new Baz();
spl_autoload_register([$baz, 'load']);
$foo = new Foo();
  • spl_autoload_register()にクラスをロードするためのロード用関数を指定する。
  • __autoload()と違い、ロード用関数を複数指定することができ、new Foo()する際にはFoo.phpが見つかってFooクラスをロードできるまでに、ロード用関数を次々に実行していく。
  • ただし、一度Fooクラスが見つかると、残りのロード用関数はもう実行されない。
  • また、spl_autoload_register()を使うと、__autoload()関数は実行されなくなる。
  • よって、必要ならspl_autoload_register('__autoload')としておけば、これまで通り__autoload()関数を実行できる。

参考


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2018-05-15 (火) 07:42:17 (93d)