大規模なPHPアプリケーションを構築する場合、コード組織構造の利点と短所は、プロジェクトの保守性と開発効率に直接影響します。 PHPによって提供されるget_include_path()およびset_include_path()は、インクルードパス(_pathを含む)の設定と取得に使用される2つの非常に実用的な関数です。それらの助けを借りて、複数のディレクトリでクラスファイル、構成ファイル、ライブラリ、その他のリソースを効率的に見つけてロードできます。
include_pathは、 PHPが実行時にファイルを検索するパスのパスリストです。基本的に、システムパスセパレーターに接続されたパス文字列のセットです。たとえば、UNIXシステムでは、次のように見える場合があります。
/usr/local/lib/php:/home/user/project/includes
これは、あなたが電話するときを意味します:
include 'myClass.php';
PHPは、/usr/local/lib/phpおよび/home/user/project/includeでmyclass.phpファイルを探します。
get_include_path()は、current include_path構成を取得するために使用されます。それの典型的な使用法は、パスをデバッグまたは動的に追加するためのものです。
echo get_include_path();
または、 set_include_path()と併せて使用します。
$path = get_include_path();
set_include_path($path . PATH_SEPARATOR . '/home/user/project/lib');
中型および大規模なPHPアプリケーションでは、コードは多くの場合、複数のディレクトリに配布されます。たとえば、:
コアライブラリ: /コア
コントローラー: /APP /コントローラー
モデル: /app /モデル
サードパーティライブラリ: /ベンダー
ファイルがロードされるたびに絶対パスを使用すると、コードは長く維持するのが困難になります。 include_pathを設定することにより、これらすべてのディレクトリをパスに追加できます。
set_include_path(
implode(PATH_SEPARATOR, [
'/var/www/html/core',
'/var/www/html/app/controllers',
'/var/www/html/app/models',
'/var/www/html/vendor',
get_include_path()
])
);
セットアップしたら、パスについて心配することなく、クラスや構成ファイルを簡単にロードできます。
require_once 'UserController.php';
require_once 'Database.php';
効率をさらに向上させるために、通常、SPL_AUTOLOAD_REGISTER()を使用するなど、自動負荷メカニズムと組み合わせて使用されます。
spl_autoload_register(function ($className) {
include $className . '.php';
});
include_pathと組み合わせて、PHPはすべての設定されたパスで$ classname.phpファイルを探します。このようにして、フレームワークを導入せずにPSR-0/PSR-4のような自動荷重を実装できます。
include_pathをグローバルにphp.iniに設定できます。
include_path = ".:/var/www/html/includes:/var/www/html/vendor"
または、 .htaccessファイル(apacheのみ)に設定します。
php_value include_path ".:/var/www/html/includes:/var/www/html/vendor"
もちろん、最も柔軟な方法は、エントリファイルに動的に設定することで、パス構造をさまざまな展開環境に従って自由に調整できるようにすることです。
define('BASE_PATH', dirname(__FILE__));
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/core',
BASE_PATH . '/lib',
BASE_PATH . '/modules',
BASE_PATH . '/vendor',
get_include_path()
])
);
エンタープライズレベルのシステムを開発しているとしたら、ディレクトリ構造は次のとおりです。
/var/www/html/
├── index.php
├── core/
│ └── App.php
├── lib/
│ └── Utils.php
├── modules/
│ └── Auth.php
├── vendor/
│ └── autoload.php
index.phpでパスを設定し、以下を使用します。
define('BASE_PATH', __DIR__);
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/core',
BASE_PATH . '/lib',
BASE_PATH . '/modules',
BASE_PATH . '/vendor',
get_include_path()
])
);
require_once 'App.php';
require_once 'Utils.php';
require_once 'Auth.php';
これらのモジュール間に相互依存性がある場合、このメカニズムはモジュールの再利用性とコードメンテナビリティを大幅に改善します。
PHPは、include_pathのパスの順序でファイルを検索します。したがって、ファイルの間違ったバージョンへの読み込みを防ぐために、パスの優先順位を慎重に配置する必要があります。たとえば、サードパーティのパスの前にローカルプロジェクトへのパスを配置できます。
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/app',
BASE_PATH . '/lib',
BASE_PATH . '/vendor/gitbox.net/framework',
get_include_path()
])
);
get_include_path()およびset_include_path()は、大規模なPHPアプリケーションの整理に不可欠なツールです。 include_pathを合理的に構成し、自動荷重メカニズムと組み合わせることにより、コードの負荷はよりスマートで簡潔にすることができます。これは、複数のサブモジュール、ライブラリ、およびコンポーネントを使用する大規模プロジェクトのデカップリングとモジュール化を達成する上で重要なステップです。
構成のほんの数行で、PHPアプリケーションは構造と保守性に大きな一歩を踏み出すことができます。