PHPのOOPにおける独自クラスオートロード関数

デフォルトのオートロードが何らかの理由で 満足できないことがよくあります。そのような場合、 独自のオートロードを書くことができます。

そのためには、関数 spl_autoload_register の最初のパラメータとして、あなたが書いた コールバック関数を渡す必要があります。この関数は、 PHPがロードされていないクラスへの参照を 検出したときに呼び出されます。この関数のパラメータには、 名前空間を含むクラス名が渡されます:

php<?php
  spl_autoload_register(function($class) {
    // 変数 $class には名前空間を含むクラス名が入ります
  });
?>

そして、この関数の責務は、クラス名に基づいて require を通じてそのクラスをロードすることです。 つまり、この関数内に、クラスをロードするための 独自のルール、つまり独自の命名規則を記述する必要があります。

では、いくつかの独自オートロードの例を書いてみましょう。 例えば、サイトのルートからのクラスファイルへのパスが、 名前空間と同じであるが、大文字と小文字を区別して 保持されるとします。

つまり、クラス Core\Admin\PageController がある場合、 そのパスは Core/Admin/PageController.php でなければなりません。

ご覧のとおり、名前空間を含むクラス名を変換するには、 バックスラッシュをスラッシュに変更し、クラス名に .php を追加するだけです。これを実装しましょう:

php<?php
  spl_autoload_register(function($class) {
    $filename = str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

ただし、これではファイルへの相対パス (サイトルートからの)になってしまいます。 絶対パスにする方が良いでしょう。以下のようにします:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

さらにもう一つ注意点があります。異なるオペレーティングシステムでは、 フォルダ間のパスの区切り文字がスラッシュまたは バックスラッシュになることがあります。私たちのコードを オペレーティングシステムに依存しないようにしましょう。 そのためには、パスの区切りとしてのスラッシュの代わりに、 現在スクリプトが実行されているオペレーティングシステムの 正しい区切り文字を含む定数 DIRECTORY_SEPARATOR を使用します。最終的に次のコードになります:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $ds = DIRECTORY_SEPARATOR;
    
    $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
    require($filename);
  });
?>
Задание 1

私が作成したオートロード関数をテストしてください。

Задание 2

独自のオートロードルールを考え出し、 それを実装してください。