autoloadについて

はじめの頃のPHPは「1ファイル完結」になることが多いかと思うのですが。
ある程度するとクラスを使うようになります。

クラスは、PHPにおいては「1ファイルに複数クラスを記述する」事も可能なのですが(言語によっては出来ません)、慣習として「1ファイルあたり1クラス」である事が多い、と思います。
ただ……それで「沢山のクラス」を使うようになると、プログラムの先頭で、require_once(requireでもincludeでもinclude_onceでもよいですが)を沢山書く必要が出てきます。

勿論「頑張って書く」でもよいのですが。
PHPには「クラスのオートローディング(Autoloading Classes)」という仕組みがあり、「必ずしも列挙しなくてもよい」仕組みが、存在します。

端的には「未定義のクラスを使おうとした時、使う直前に"特定の関数"をcallしてくれる」仕組みがあります。
旧来、__autoload()という関数が、その仕組みを担っていました。
例えば

function __autoload($classname) {
    $filename = "./". $classname .".php";
    require_once($filename);
}

というコードを書けば、(ファイルがその位置にあれば、ですが)require_onceをしなくてもクラスを自由に使う事ができます。
ただ、__autoload()は「PHP 7.2.0 で 非推奨」になるので、少し注意が必要ですが。

新しいバージョンだと、spl_autoload_register()が使えます。「(PHP 5 >= 5.1.0, PHP 7)」とあるので、PHP5.1.0以降ならOKですね。
この関数を使うと

spl_autoload_register(
    function ($classname) {
        $filename = "./". $classname .".php";
        require_once($filename);
    }
);

といった感じで登録できます。これは「無名関数」を使った例ですね。

例えば、登録用の関数を別で作っていれば

function hoge_loader($classname) {
   $filename = "./". $classname .".php";
   require_once($filename);
}
//
spl_autoload_register(hoge_loader);

といった書き方や、もし静的なクラスに実装がある場合は

class Hoge {
    static public function loader($classname) {
        $filename = "./". $classname .".php";
        require_once($filename);
    }
}

//
spl_autoload_register(['Hoge', 'loader']);

といった書き方も出来ます。
このあたりの「コールバックの書き方」は https://note.mu/gallu/n/na2feecee2738 に書いてありますので、分からない時は確認をしてみましょう。

spl_autoload_register()には第二引数と第三引数もあるので、興味がある方は、きちんと調べてみるとよいと思います( http://php.net/manual/ja/function.spl-autoload-register.php )。

この「オートローディング」は、どちらかというと「登録している関数がどんな処理をするか(=どんな風にファイル名を作成していくか)」のあたりがキモになるのですが。
まずは「存在しないクラスを使おうとしたときに、いきなりエラーにする前に、オートローディングという機能が(登録されていれば)走る」という仕組みを知っておくと、色々と全体の動きで「腑に落ちる」事もあるのではないか、と思います。

この記事が気に入ったらサポートをしてみませんか?