phpの__autoload関数とかspl_autoload_registerについて理解したのでまとめておく
phpの__autoload
関数やspl_autoload_register
関数について、ようやく理解ができたのでまとめていくよ。
spl_autoload_register
関数の役割や使い方について
まずは、php5.1以上でよく見られるようになったspl_autoload_register
関数から解説していく。
spl_autoload_register
関数とは、未定義のクラスが呼び出された時に、自動で呼び出す関数を指定できるものだ。
参考:PHP: spl_autoload_register - Manual
この説明だけだとわかりにくいので、以下は具体例を挙げていく。
例えば、あなたが以下のような2つのコードを用意したとしよう。
// Config.php
<?php
class Config {
// code
}
// index.php
<?php
require 'config.php'
$config = new Config();
上記のコードは動くことは動くが、この先クラスが増えて扱うファイルが増えるごとにrequire
関数を増やすことになってしまうし、相当面倒臭い。
そこで上記のindex.php
を以下のように書き換える。
// index.php
<?php
spl_autoload_register("classLoad");
function classLoad($class) {
require dirname(__FILE__) . $class . ".php";
}
$config = new Config();
普通だとrequire
等でファイルを読み込んでいない状態でクラスを読んでいるので、クラスの未定義エラーが起こるはずだ。
しかし、spl_autoload_register("classLoad")
としてあげることで、未定義のクラスが呼ばれた時にclassLoad
関数を自動で読んでくれる、と言うのがspl_autoload_register
関数の便利なところだ。
また、spl_autoload_register
の引数には呼ばれたクラス名が格納される。上記の例では、Config
クラスが呼ばれたので、$class
引数にはConfig
が格納される。
また、spl_autoload_register
はRoute
クラスのメソッドの中で定義する、と言う場合も多い。
<?php
class Route {
public function __construct()
{
spl_autoload_register('Route::regsterRoute');
}
public function regsterRoute($class)
{
}
}
__autoload関数とはどんな働きがあるのか?
spl_autoload_register
と似たような関数として、__autoload
関数がある。この__autoload
関数も未定義のクラスが呼び出された時に実行されるものだが、spl_autoload_register
との違いは、「複数の__autoload
を設定できない事」だ。
参考:autoload - php spl_autoload_register vs __autoload? - Stack Overflow
例えば、spl_autoload_register
だと、以下のように複数設定できるが、__autoload
は1つだけしか設定できないと言う違いがある。
<?php
spl_autoload_register('Config');
spl_autoload_register('User');
公式ドキュメントを読むと、__autoload
関数はphp7.2から非推奨になっているし、公式もspl_autoload_register
を使うことを推奨している。
ただ、spl_autoload_register
はphp5.1以上から使用可能で、__autoload
はphp5以上から使用可能の関数なので、php5.1以上はspl_autoload_register
、php5.1未満のphp5の場合は__autoload
を使うのが良いだろう。