【PHP8.x】set_include_path関数の使い方

作成日: 更新日:

set_include_path関数は、PHPが外部ファイルを読み込む際の探索パスを設定する関数です。この関数は、includerequireといったPHPの命令が、プログラム中で指定されたファイルをどのディレクトリから探し出すかを定義するために使用されます。

具体的には、set_include_path関数に新しいincludeパスの文字列を引数として渡すことで、PHPがファイルを探しに行くパスリストを変更します。これにより、常にファイルの絶対パスを指定することなく、設定されたパスを基準とした相対パスでファイルを読み込むことが可能となり、コードの可搬性や保守性が向上します。例えば、プロジェクト内で共通して利用するライブラリファイル群を特定のディレクトリにまとめておき、そのディレクトリをincludeパスに設定することで、どのスクリプトからでも簡単にそれらのファイルを読み込めるようになります。

複数のディレクトリを探索パスとして指定したい場合は、オペレーティングシステムに応じた区切り文字を使用します。Unix系のシステムではコロン(:)を、Windows系のシステムではセミコロン(;)を用いて各パスを連結します。この設定はPHPスクリプトの実行中に動的に変更することができ、現在のincludeパスの値はget_include_path関数で取得できます。セキュリティの観点から、必要最低限のパスのみを設定し、信頼できないディレクトリを含めないように注意することが推奨されます。

基本的な使い方

構文(syntax)

<?php
$previous_include_path = set_include_path('/path/to/my/libraries:/path/to/my/helpers');
?>

引数(parameters)

string $include_path

  • string $include_path: インクルードパスとして設定したい文字列を指定します。複数のパスを指定する場合は、OSに依存したパス区切り文字(Linux/macOSではコロン :、Windowsではセミコロン ;)で連結します。

戻り値(return)

string|false

現在のインクルードパスの設定を文字列で返します。設定に失敗した場合は false を返します。

サンプルコード

PHP set_include_path でインクルードパスを変更する

<?php

/**
 * PHPのset_include_path関数を使用して、スクリプト実行中に
 * include() や require() でファイルを検索するディレクトリパスを動的に変更する例。
 *
 * set_include_pathは、ini_set('include_path', ...) と同様にインクルードパスを設定しますが、
 * 成功した場合は古いインクルードパスを文字列として返します。
 */

// 1. 現在のインクルードパスを取得して表示します。
// デフォルトでは、PHP設定ファイル(php.ini)で定義されたパスや、現在のスクリプトのディレクトリなどが含まれます。
echo "--- 初期状態 ---" . PHP_EOL;
echo "現在のインクルードパス: " . get_include_path() . PHP_EOL . PHP_EOL;

// 2. 新しくインクルードパスに追加したいカスタムライブラリのディレクトリを定義します。
// ここでは、現在のスクリプトと同じディレクトリに 'my_custom_libs' という仮のディレクトリを使用します。
$customLibDir = __DIR__ . DIRECTORY_SEPARATOR . 'my_custom_libs';

// デモンストレーションのため、カスタムライブラリディレクトリが存在しない場合は作成します。
if (!is_dir($customLibDir)) {
    mkdir($customLibDir);
    echo "ディレクトリ '{$customLibDir}' を作成しました。" . PHP_EOL;
}

// 3. 新しいインクルードパス文字列を作成します。
// 既存のインクルードパスに新しいディレクトリを追加するために、get_include_path() で現在のパスを取得します。
// PATH_SEPARATOR はOSに応じたパス区切り文字(Windowsでは ';', Unix系では ':')を自動的に提供します。
$newIncludePath = $customLibDir . PATH_SEPARATOR . get_include_path();

// 4. set_include_path() を使用して、インクルードパスを更新します。
// この関数は成功すると古いインクルードパスを返し、失敗すると false を返します。
$oldPath = set_include_path($newIncludePath);

echo "--- パス設定後 ---" . PHP_EOL;
if ($oldPath !== false) {
    echo "インクルードパスが正常に更新されました。" . PHP_EOL;
    echo "更新前のインクルードパス: " . $oldPath . PHP_EOL;
    echo "現在のインクルードパス: " . get_include_path() . PHP_EOL . PHP_EOL;

    // 5. 新しいパスが機能することを示すために、カスタムライブラリディレクトリに一時的なファイルを作成し、
    // パスを指定せずに include してみます。
    $testFile = $customLibDir . DIRECTORY_SEPARATOR . 'ExampleClass.php';
    file_put_contents($testFile, "<?php class ExampleClass { public function sayHello() { echo 'Hello from ExampleClass in custom library!' . PHP_EOL; } }");
    echo "テストファイル '{$testFile}' を作成しました。" . PHP_EOL;

    echo "--- テストファイルのインクルード ---" . PHP_EOL;
    // set_include_path で設定したパスからファイルが検索されるため、
    // ディレクトリパスを指定せずに 'ExampleClass.php' をインクルードできます。
    if (include 'ExampleClass.php') {
        $obj = new ExampleClass();
        $obj->sayHello();
    } else {
        echo "ExampleClass.php のインクルードに失敗しました。" . PHP_EOL;
    }

    // 6. クリーンアップ: デモンストレーションのために作成したファイルとディレクトリを削除します。
    echo PHP_EOL . "--- クリーンアップ ---" . PHP_EOL;
    if (file_exists($testFile)) {
        unlink($testFile);
        echo "テストファイル '{$testFile}' を削除しました。" . PHP_EOL;
    }
    if (is_dir($customLibDir)) {
        rmdir($customLibDir);
        echo "ディレクトリ '{$customLibDir}' を削除しました。" . PHP_EOL;
    }

} else {
    echo "インクルードパスの設定に失敗しました。" . PHP_EOL;
}

// スクリプト終了後、変更されたインクルードパスは元の値に戻ります。
// set_include_path による変更は、現在のスクリプトの実行中のみ有効です。

?>

set_include_pathは、PHPスクリプト内でinclude()require()関数が外部ファイルを検索するディレクトリパスを、実行中に動的に設定するための関数です。これにより、php.iniで設定されたデフォルトのインクルードパスに加えて、プログラムが必要とする特定のライブラリディレクトリなどを一時的に追加・変更できます。

引数$include_pathには、新しいインクルードパスを文字列として渡します。複数のディレクトリを指定する際は、オペレーティングシステムに合わせたパス区切り文字(PATH_SEPARATOR定数で自動的に取得できます)で区切って記述します。この関数は、パスの設定が成功した場合には、変更前の古いインクルードパスを文字列として返します。設定に失敗した場合はfalseを返します。

サンプルコードでは、まず現在のインクルードパスを表示し、次に新しいカスタムライブラリディレクトリを既存のパスに追加しています。get_include_path()で現在のパスを取得し、PATH_SEPARATORを用いて新しいパスと連結することで、複数のディレクトリをインクルードパスに含める方法を示しています。set_include_path()でこの新しいパスを設定後、ディレクトリを指定せずにテスト用のPHPファイルをインクルードできることを実演しています。この設定は現在のスクリプトの実行期間中のみ有効で、スクリプト終了後には元のインクルードパスに戻ります。ini_set('include_path', ...)と同じようにインクルードパスを設定できますが、set_include_pathは古いパスを戻り値として返す点が特徴です。

set_include_path関数は、PHPスクリプト実行中にinclude()require()がファイルを検索するディレクトリパスを動的に変更します。ini_set('include_path', ...)と同様の効果がありますが、成功時には変更前の古いインクルードパスを文字列として返しますので、エラーハンドリングのために戻り値を必ず確認してください。複数のパスを指定する際は、OSに依存しないパス区切り文字としてPATH_SEPARATORを利用するのが重要です。この関数の変更は現在のスクリプトの実行中のみ有効であり、他のプロセスや次のリクエストには影響しません。セキュリティのため、不必要なパスや信頼できないパスをインクルードパスに追加しないよう細心の注意が必要です。現代のPHP開発では、PSR-4などのオートローダーの利用が推奨されることが多く、この関数の使用機会は減少しています。

PHPでインクルードパスに複数ディレクトリを設定する

<?php

/**
 * このスクリプトは、PHPのインクルードパスに複数のディレクトリを追加する方法を示します。
 * インクルードパスは、`require`、`include` などの関数がファイルを検索するディレクトリのリストです。
 * PATH_SEPARATOR を使用して複数のパスを結合し、既存のパスに新しいパスを追加します。
 */

// 1. 現在のPHPインクルードパスを取得します。
//    これにより、既存のパスを上書きせずに新しいパスを追加できます。
$currentIncludePath = get_include_path();
echo "現在のインクルードパス: " . $currentIncludePath . PHP_EOL . PHP_EOL;

// 2. インクルードパスに追加したい新しいディレクトリのリストを定義します。
//    これらのパスは、プロジェクト内のライブラリやモジュールがある場所を想定しています。
//    ここでは、現在のスクリプトと同じ階層にある仮想の 'my_lib_a' と 'my_lib_b' ディレクトリを使用します。
$newIncludeDirs = [
    __DIR__ . '/my_lib_a', // 例: 独自のライブラリA
    __DIR__ . '/my_lib_b', // 例: 独自のライブラリB
];

// 3. サンプルコードを単体で動作させるために、新しいディレクトリとテスト用のダミーファイルを作成します。
//    本番環境では、これらのディレクトリが事前に存在することが一般的です。
foreach ($newIncludeDirs as $dir) {
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
        echo "ディレクトリを作成しました: " . $dir . PHP_EOL;
    }
    // テスト用のダミーファイルを作成
    $fileName = 'test_library_file.php';
    file_put_contents($dir . '/' . $fileName, "<?php echo 'ファイル: " . basename($dir) . "/" . $fileName . " がインクルードされました。' . PHP_EOL;");
}
echo PHP_EOL;

// 4. 新しいインクルードパス文字列を作成します。
//    `PATH_SEPARATOR` (OSに依存するパス区切り文字、Windowsではセミコロン`;`、Linuxではコロン`:`)
//    を使用して複数のパスを連結し、現在のパスの前に新しいパスを追加します。
//    これにより、新しいライブラリが既存のシステムライブラリよりも優先的に検索されるようになります。
$newPathString = implode(PATH_SEPARATOR, $newIncludeDirs) . PATH_SEPARATOR . $currentIncludePath;

// 5. `set_include_path()` 関数を使って、新しいインクルードパスを設定します。
//    この関数は、設定が成功した場合は前のインクルードパスを、失敗した場合は false を返します。
$previousPath = set_include_path($newPathString);

if ($previousPath !== false) {
    echo "インクルードパスが正常に設定されました。" . PHP_EOL;
    echo "新しいインクルードパス: " . get_include_path() . PHP_EOL . PHP_EOL;

    // 6. 設定されたパスからのファイルのインクルードをテストします。
    //    `set_include_path` が正しく機能していれば、上記で作成したダミーファイルを見つけることができます。
    //    インクルードパスの順序により、最初にマッチしたファイルがインクルードされます。
    echo "新しいインクルードパスからのファイルをテスト中..." . PHP_EOL;
    try {
        // 'test_library_file.php' は 'my_lib_a' または 'my_lib_b' のいずれかに存在します。
        // 'my_lib_a' がパスの先頭にあるため、そちらのファイルが優先的にインクルードされます。
        include 'test_library_file.php';
        echo PHP_EOL;
    } catch (Throwable $e) {
        echo "エラー: ファイルのインクルード中に問題が発生しました - " . $e->getMessage() . PHP_EOL;
    }

} else {
    echo "インクルードパスの設定に失敗しました。" . PHP_EOL;
}

// 7. スクリプト実行後のクリーンアップ。
//    作成したダミーディレクトリとファイルを削除します。
//    本番環境のコードでは通常この処理は不要です。
echo "クリーンアップ中..." . PHP_EOL;
foreach ($newIncludeDirs as $dir) {
    if (is_dir($dir)) {
        // ディレクトリ内のファイルを削除
        foreach (new DirectoryIterator($dir) as $fileInfo) {
            if ($fileInfo->isDot()) continue;
            unlink($fileInfo->getPathname());
        }
        // 空になったディレクトリを削除
        rmdir($dir);
        echo "ディレクトリを削除しました: " . $dir . PHP_EOL;
    }
}
?>

PHPのset_include_path関数は、requireincludeなどの関数がインクルードするファイルを検索するディレクトリのリスト(インクルードパス)を設定するために利用されます。引数$include_pathには、設定したい新しいインクルードパスを文字列として指定します。複数のディレクトリをパスに含める場合は、OSに応じたパス区切り文字であるPATH_SEPARATOR(Windowsではセミコロン;、Linuxではコロン:)で各パスを連結します。

このサンプルコードでは、get_include_path()関数で現在のインクルードパスを取得し、それを上書きすることなく、PATH_SEPARATORを使って新しいディレクトリパスを追加する方法を示しています。これにより、プロジェクト固有のライブラリやモジュールがあるディレクトリをインクルードパスに追加し、ファイルを効率的に見つけられるようになります。追加されたパスは、既存のパスよりも優先的に検索されるように設定されることが一般的です。

set_include_path()関数の戻り値は、パスの設定が成功した場合はその時点での前のインクルードパスの文字列、失敗した場合はfalseとなります。この機能により、アプリケーションの構成に合わせて柔軟にファイル検索パスを管理できます。

set_include_pathを使用する際は、既存のパスを上書きしないようget_include_path()で現在のパスを取得し、PATH_SEPARATORで結合して追加するようにしてください。新しいパスを既存のパスの前に置くと、そちらが優先的に検索されますので、意図しないファイルの読み込みが発生しないようパスの順序は慎重に決定する必要があります。セキュリティ上、インクルードパスにユーザー入力値や信頼できないパスを含めてはなりません。また、パスはスクリプトの実行場所によらず常に絶対パスで指定することを推奨します。この設定はスクリプト実行中のみ有効であり、永続的な設定にはphp.iniinclude_pathディレクティブを使用します。多くのモダンなPHPフレームワークでは独自のオートローダー機構を提供しているため、set_include_pathを直接操作することは稀です。

【PHP8.x】set_include_path関数の使い方 | いっしー@Webエンジニア