* クラスのオートロード [#l85cfdd6]

** オートロードを利用しない場合 [#ca5487a6]

 <?php
 include_once('Foo.php')
 $foo = new Foo();

- 以上のようにnew Fooする前にFooクラスを定義したファイルのパスをinclude_once()で指定する必要がある。

** __autoload()を使ってクラスをオートロードする [#m0eee348]

 <?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()できようにしておく。
- __autoload()関数を定義して、任意のクラスを定義したファイルをinclude()できるようにしておく。
- これによってnew Foo()すればFoo.phpが、new Bar()すればBar.phpが自動的にinclude()されて便利。
- ただし、この機能はdeprecateで非推奨になっているので、もう使わない方がよい。

** spl_autoload_register()を使ってクラスをオートロードする [#j5376a8b]

 <?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()関数を実行できる。

** 参考 [#n95c5765]

- http://php.net/manual/ja/language.oop5.autoload.php

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