PHPのOOPにおける独自クラスオートロード関数
デフォルトのオートロードが何らかの理由で 満足できないことがよくあります。そのような場合、 独自のオートロードを書くことができます。
そのためには、関数 spl_autoload_register
の最初のパラメータとして、あなたが書いた
コールバック関数を渡す必要があります。この関数は、
PHPがロードされていないクラスへの参照を
検出したときに呼び出されます。この関数のパラメータには、
名前空間を含むクラス名が渡されます:
<?php
spl_autoload_register(function($class) {
// 変数 $class には名前空間を含むクラス名が入ります
});
?>
そして、この関数の責務は、クラス名に基づいて
require を通じてそのクラスをロードすることです。
つまり、この関数内に、クラスをロードするための
独自のルール、つまり独自の命名規則を記述する必要があります。
では、いくつかの独自オートロードの例を書いてみましょう。 例えば、サイトのルートからのクラスファイルへのパスが、 名前空間と同じであるが、大文字と小文字を区別して 保持されるとします。
つまり、クラス Core\Admin\PageController がある場合、
そのパスは Core/Admin/PageController.php でなければなりません。
ご覧のとおり、名前空間を含むクラス名を変換するには、
バックスラッシュをスラッシュに変更し、クラス名に
.php を追加するだけです。これを実装しましょう:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
ただし、これではファイルへの相対パス (サイトルートからの)になってしまいます。 絶対パスにする方が良いでしょう。以下のようにします:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
さらにもう一つ注意点があります。異なるオペレーティングシステムでは、
フォルダ間のパスの区切り文字がスラッシュまたは
バックスラッシュになることがあります。私たちのコードを
オペレーティングシステムに依存しないようにしましょう。
そのためには、パスの区切りとしてのスラッシュの代わりに、
現在スクリプトが実行されているオペレーティングシステムの
正しい区切り文字を含む定数 DIRECTORY_SEPARATOR
を使用します。最終的に次のコードになります:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
私が作成したオートロード関数をテストしてください。
独自のオートロードルールを考え出し、 それを実装してください。