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