複数のPHPプロジェクトを開発する際、一部のモジュールやライブラリを複数のプロジェクト間で共有する必要がある状況に遭遇することがよくあります。たとえば、検証ライブラリ、ログシステム、構成管理など。各プロジェクトでこれらのモジュールの繰り返しの書き込みを避けるために、通常、それらを別のコードベースに抽出し、複数のプロジェクトと共有します。
PHPのget_include_path()およびset_include_path()関数は、エレガントなパス管理メカニズムを提供し、プロジェクト間の共有コードをより柔軟で保守可能にします。この記事では、これらの関数を使用して、マルチプロジェクト環境でパブリックファイルパスの統一された管理を実現する方法を詳細に紹介します。
include_pathは、phpのデフォルトディレクトリリストであり、実行時にファイルを見つけます。 get_include_path()を介してcurrentのcurringを表示するか、 set_include_path()を介してカスタムディレクトリを追加できます。
echo get_include_path();
デフォルトの出力は次のようなものかもしれません:
.:/usr/local/lib/php
つまり、PHPは最初に現在のディレクトリ( 。 )に含めるファイルを探します。見つからない場合は、 /usr/local/lib/phpに移動して検索します。
/var/shared/php-lib/ディレクトリの公共図書館があり、 ogger.phpやvalidator.phpなどの複数の共有クラスと関数が含まれていると想像してください。
各プロジェクトで、この共有ライブラリへの絶対的なパスを気にする必要がないことを願っています。次のように参照する必要があります。
require_once 'Logger.php';
これを達成するために、プロジェクトエントリファイルのconter_pathを動的に変更できます。
$sharedLibPath = '/var/shared/php-lib/';
$currentIncludePath = get_include_path();
$newIncludePath = $sharedLibPath . PATH_SEPARATOR . $currentIncludePath;
set_include_path($newIncludePath);
これで、 Logger.phpは、絶対的なパスを書くことなく、現在のプロジェクトで_onceを直接要求できます。
プロジェクトが自動荷重メカニズム(PSR-4やPSR-0など)を使用している場合、共有ディレクトリをネームスペースにマップし、 spl_autoload_register()と組み合わせて自動負荷を実現できます。
spl_autoload_register(function ($class) {
include $class . '.php';
});
この時点で、クラスファイルが共有パスに存在し、命名とディレクトリの構造が一貫している限り、自動的にロードできます。
柔軟性を高めるために、 Bootstrap.phpの作成など、初期化スクリプトとしてパス管理をカプセル化することもできます。
<?php
// bootstrap.php
$sharedLibPath = '/var/shared/php-lib/';
set_include_path($sharedLibPath . PATH_SEPARATOR . get_include_path());
spl_autoload_register(function ($class) {
include $class . '.php';
});
各プロジェクトの入り口にこのファイルを紹介します。
require_once '/var/shared/php-lib/bootstrap.php';
一部の開発者は、次のようなURLを介してリモートコードを直接読み込むことを考える場合があります。
include 'https://gitbox.net/shared/Logger.php';
これはいくつかのシナリオでは可能ですが、セキュリティやパフォーマンスの理由には推奨されません。リモートロードされたコードには、改ざんされるリスクがあり、可用性と速度を確保することは困難です。より良い方法は、gitサブモジュールまたは作曲家を使用して依存関係を管理して、共有コードベースをローカルにプロジェクトに統合することです。
ただし、このようなリモートリファレンスを実行したい場合は、 evanable_url_includeを使用して、次のような信頼できるソースを使用してください。
ini_set('allow_url_include', 1);
include 'https://gitbox.net/shared/Validator.php';
繰り返しますが、この慣行は生産環境で避けるべきです。
get_include_path()およびset_include_path()を使用して、PHPプロジェクトの効率的な共有コードメカニズムを構築できます。コードの再利用率を改善するだけでなく、プロジェクト構造をより明確にし、保守可能にします。パスを合理的に構成し、自動ローダーを組み合わせることにより、複数のプロジェクト間でロジックモジュールの完全にシームレスな共有を実現することもできます。
ただし、統一されたパス構成には明確な仕様が必要です。各プロジェクトの開始時に統一された初期化スクリプトを実行し、プロジェクトのハードコーディングパスを回避したり、特定のディレクトリ構造に依存したりしないように、パス構成を抽象化することをお勧めします。これにより、マルチプロジェクトのコラボレーションがよりスムーズになり、コストが少なくなります。