PHPのコードで環境準備が最もいらない(最もどのような環境でも動く)ローディング方法は手書きでrequire, includeをファイルに直接記述することです。そうするとあるrequirem, includeで指定したディレクトリにコードを置く、あるいはPHPがファイルを探すディレクトリのリストのパスを通すと、各ファイルが各ファイルを適切に読みあいます。この記事ではこの手のお手製ローディング付きライブラリをソースコード内で完結して呼び出す方法を紹介します。
これはこれで便利ですが困ったことにオートローダの仕組みを度外視しており、オートロードがある環境でオートローダの示すやり方に則ろうとするとどうにもうまくいきません。
【PHP】Composerのautoload機能 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発
この様な場合、無理にオートローダに読み込ませようとせず、当初想定されていたinclude、require状態を再現するとよいです。
使うのはPHPのオプションをPHP内部で設定する関数群の一つ set_include_path です。
PHP: set_include_path – Manual
これを使うとPHPの設定のinclude_path(ファイルを探すディレクトリパスののリスト)の指定ができます。
PHP: コア php.ini ディレクティブに関する説明 – Manual
実際のコードは次になります。例によってLaravelで初期読み込みをするAppServiceProvider内に読み込み処理を書きました。
class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register(): void { // OSに依存しないセパレータ定数DIRECTORY_SEPARATORで各文字列を結合することでOSに依存しないパスを表現 $path = implode(DIRECTORY_SEPARATOR, [base_path(), 'vendor_packages', 'HOGE', 'client', 'src']); // get_include_path()で元のinclude_pathを取得、OSに依存しないセパレータであるPATH_SEPARATOR定数で追加のパスとつなぐ set_include_path(get_include_path() . PATH_SEPARATOR . $path); } }
こうするとお手製ローディングのコードでも無理なく、記述をやたら増やすこともなく取り込めます。