複雑なPHPプロジェクトを構築する場合、構成ファイル、関数ライブラリ、テンプレートなど、複数のサイトまたはサブシステム間でコードを共有する必要があることがよくあります。 PHPによって提供されるget_include_path()およびset_include_path()関数により、ファイルの検索パスを柔軟に構成し、サイトまたはプロジェクト間でファイルの導入を実装し、コードの再利用性と維持可能性を大幅に改善できます。
include_pathは、phpの構成オプションであり、Default Directoryリストを含める、 requient 、 include_once 、およびrequire_onceファイルの検索を指定します。ファイルへのパスが絶対的なパスではない場合、PHPはこれらのディレクトリのファイルを順番に探します。
include_pathは、 php.ini 、 set_include_path()関数を介して変更できます。
get_include_path()は、current include_pathの設定を取得するために使用されます。
echo get_include_path();
通常、コロン(Linux/Unix)またはセミコロン(Windows)で区切られた文字列を返します。
2つのサイトがあると想像してください。
メインサイト: https://www.gitbox.net/
サブサイト: https://sub.gitbox.net/
メインサイトには、いくつかの一般的なツールライブラリファイルが保存されています。サブサイトがこれらのファイルをコピーすることなく、これらのファイルを介して直接使用できることを願っています。
メインサイトの共有ディレクトリが/var/www/gitbox.net/sharedであると仮定すると、サブサイトのエントリファイルに追加します。
<?php
// オリジナルを取得します include_path
$originalPath = get_include_path();
// メインサイトの共有ディレクトリを追加します
$newPath = '/var/www/gitbox.net/shared' . PATH_SEPARATOR . $originalPath;
// 新しいものをセットアップします include_path
set_include_path($newPath);
// 共有ライブラリの紹介
include 'common_functions.php';
このようにして、 common_functions.phpファイルは、実際にサブサイトのディレクトリ構造内にない場合でも、サブサイトで参照できます。
より推奨されるアプローチは、クラスファイルをロードするときに自動ローダーを使用して自動的に検索することです。
<?php
set_include_path('/var/www/gitbox.net/shared' . PATH_SEPARATOR . get_include_path());
spl_autoload_register(function ($className) {
include $className . '.php';
});
UTILS \ Loggerクラスが、このクラスがサブサイトで使用される場合、共有/utils/logger.phpで定義されているとします。
<?php
use Utils\Logger;
$logger = new Logger();
PHPは、include_pathに従って、 utils/logger.phpファイルを自動的に検索およびロードします。
include_pathを構成することでクロスサイトの共有を実現できますが、特にパスが制限されていない場合、悪意を持って上書きされたり、間違ったファイルが導入されたりする可能性があります。この目的のために:
共有ディレクトリの権限を厳密に制御します。
include_pathにユーザーに慣れたディレクトリを追加しないでください。
RealPathを使用してファイルの場所を確認します。
共有ディレクトリの名前空間を使用して、名前の競合を避けます。
開発中に、current currentを印刷して、構成が効果的かどうかを確認できます。
echo '現在 include_path: ' . get_include_path();
さらに、failsを含める場合、 ini_get( 'display_errors')を使用して、簡単なトラブルシューティングのためにエラーメッセージが有効になっていることを確認できます。
get_include_path()およびset_include_path()を合理的に構成することにより、クロスサイトコード共有を優雅に達成できます。コードの再利用率を改善するだけでなく、モジュール開発の基盤も提供します。ディレクトリ構造と命名仕様に一致する限り、この方法は効率的かつ柔軟であり、大規模なPHPプロジェクトで一般的な手法です。