クラスのオートローディング

オブジェクト指向アプリケーションを作成する開発者の多くは、 クラス定義毎に一つのPHPソースファイルを作成します。 最大の問題は、各スクリプトの先頭に、必要な読み込みを行う長いリストを 記述する必要があることです(各クラスについて一つ)。

spl_autoload_register() 関数を使うと、 任意の数のオートローダーを登録でき、 クラスやインターフェイスが定義されていなくても自動的に読み込めるようになります。 オートローダーを登録すれば、PHPがエラーで止まる前にクラスをロードする最後の チャンスが与えられます。

クラスに類似した言語構造は、同じやり方でオートロードできます。 これには、クラス、インターフェイス、トレイト、列挙型が含まれます。

警告

PHP 8.0.0 より前のバージョンでは、 __autoload() 関数でもクラスやインターフェイスのオートロードが可能でした。 しかし、この関数は spl_autoload_register() 関数に比べると柔軟性という点で劣っています。 そのため、__autoload() 関数は PHP 7.2.0 で推奨されなくなり、 PHP 8.0.0 で削除されました。

注意:

複数のオートローダーを複数回登録するために、 spl_autoload_register() を複数回コールしても構いません。 但し、オートロードを行う関数から例外がスローされると、 オートロードのプロセスが中断され、 後続のオートロード関数の実行ができなくなります。 よって、オートロード関数から例外をスローすることは、 全くお勧めできません。

例1 オートロードの例

この例は、 クラス MyClass1 および MyClass2 をそれぞれ MyClass1.php および MyClass2.php からロードします。

<?php
spl_autoload_register
(function ($class_name) {
include
$class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

例2 オートロードの別の例

この例は、インターフェイス ITest をロードしようとします。

<?php

spl_autoload_register
(function ($name) {
var_dump($name);
});

class
Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>