⊗ppOpNsCA 107 of 107 menu

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); }); ?>

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

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

日本語
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItalianoქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
当サイトでは、サイトの動作、分析、パーソナライゼーションのためにクッキーを使用しています。 データ処理はプライバシーポリシーに従って行われます。
すべて受け入れる 設定 拒否