クラスのオートローディング
https://www.php.net/manual/ja/language.oop5.autoload.php
クラスのオートローディングについては、以前に「 古庄親方の上級試験コラム#018 「言語リファレンス > クラスの基礎」 」でも簡単に解説をしました。
ここでは、もう少し詳細を把握しておきましょう。
まず、 __autoload()
関数は PHP 7.2.0 で推奨されなくなり、 PHP 8.0.0 で削除されましたので、古い記述を読む時は注意しておきましょう。 今は、spl_autoload_register()
関数でオートローダをで登録します。
オートローダーとは?
classやinterfaceやtrait(以下、class等と省略)を使う場合、基本的には、includeまたはrequire(_once含む)を使って「class等が書かれているファイルを読み込んで」から使用します。
書かれているファイルを読み込まずにclass等を使おうとすると、「Fatal error: Uncaught Error: … not found」のエラーが発生します。
しかし、オートローダーが登録されている場合、エラーになる前に「登録されたオートローダー」を実行し、自動的に読み込む事を試みる事ができます。
オートローダーの登録
spl_autoload_register()
関数への登録の仕方を学びましょう。
第一引数に null を渡した場合、デフォルト実装である spl_autoload()
関数が登録されます。
この関数は「クラス名を小文字にして」「.inc および .php を拡張子につけたファイル名のファイルを」「すべてのインクルードパスから」探します。
この検索で探すインクルードパスは、get_include_path()
関数で確認ができ、set_include_path()
関数で(スプリクト実行中だけ)変える事ができます。
恒久的に変える場合は、 iniファイルで include_path
の設定を変更します。
「読み込むファイルの拡張子を変更したい」場合、 spl_autoload_extensions()
関数を使って変更する事ができます。spl_autoload_register()
で登録された関数は、 spl_autoload_functions()
関数で確認をする事ができます。
オートローダーは、自分で実装する事もできます。
また、spl_autoload_call()
関数を使って意図的に動かす事や、spl_autoload_unregister()
関数で登録したオートローダーを削除する事もできます。
このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/033.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/test.phpc
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/033_2.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/033_2_include.php