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_registerRouteクラスのメソッドの中で定義する、と言う場合も多い。

<?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を使うことを推奨している。

参考:PHP: __autoload - Manual

ただ、spl_autoload_registerはphp5.1以上から使用可能で、__autoloadはphp5以上から使用可能の関数なので、php5.1以上はspl_autoload_register、php5.1未満のphp5の場合は__autoloadを使うのが良いだろう。