メシのタネ

メシのタネになる、Laravelや設計思想の技術配信サイト


PHPでインクルードパスをスクリプト内から追加する安全な方法


  1. Webプログラム
  2. PHP
  3. PHPでインクルードパスをスクリプト内から追加する安全な方法

対象読者

  • 共有レンタルサーバーや Docker 化されていない環境で php.ini を触れない
  • .htaccess を増やしたくない
  • ひとまず 1 ファイルに追記してサクッと動かしたい フェーズの開発者

ざっくり要点

  • set_include_path() を 1 行書くだけ でインクルードパスは動的に追加できる。
  • パス連結は PATH_SEPARATOR 定数を使えば OS 依存 (:;) を忘れても OK。
  • 同じことは ini_set('include_path', …) でも出来るが、区切り文字を手書きするぶん “ミス増幅装置”。
  • 規模が大きくなるか、だれかとコードを共有するなら Composer オートローダ にすぐ移行しよう。

include_path とは?

PHP が require / include / spl_autoload_* を解決するときに検索する 検索ディレクトリのリスト。もともとは php.iniinclude_path ディレクティブで設定される。

  • メリット : 毎回フルパスを書く必要がない
  • デメリット : 可視性が低く、プロセス全体に影響する(=副作用が大きい)

覚えておきたい指針小規模なら便利、大規模なら危険

スクリプトから変更する 3 つの方法

方法使いどころひと言まとめ
set_include_path()最小構成で済ませたい既存値を取得→連結→再設定の 1 行で完結。
ini_set('include_path', …)レガシーが ini_set 文脈に寄っている区切り文字を自力で挿入。忘れると即エラー。
Composer オートローダ本番クラスローディングinclude_path を通さずクラスマップで管理。

Composer がある今、実務で include_path を増やすシーンはかなり減った。とはいえ “昔の CMS” や “とりあえずのスクリプト” ではまだ生きている技術なので、最低限の安全策は知っておくとトラブルシュートに役立つ。

set_include_path() の実装例

<?php
// 追加したいディレクトリを変数化
$extraPath = __DIR__ . '/lib';

// 既存の include_path に安全に連結して再設定
set_include_path(
    get_include_path() . PATH_SEPARATOR . $extraPath
);
  • __DIR__ で常に 絶対パス化 してから連結すると移植性が高い。
  • PATH_SEPARATOR を使えば Windows (;) / Unix (:) の差異を吸収できる。

ワンポイント — 複数追加したい場合は変数に配列で持ち、implode(PATH_SEPARATOR, $paths) でまとめると可読性が上がる。

ini_set() と何が違う?

ini_set() でも動くが、呼び出しは次のようになりがち。

ini_set('include_path', get_include_path() . ':' . $extraPath);
  • 区切り文字を手書きするので OS 混在案件だとバグ源。
  • ini_set() は **その他 ini 値を動的に変える“危ない道”**も開きがちで、レビュー時の脳内負荷が増える。

少しでも迷うなら set_include_path() を選ぶのが無難。

ベストプラクティス(2025 年版)

  1. プロジェクト規模 > 個人スクリプト なら Composer へ。composer dump-autoload -o 一発でクラス探索は終了。
  2. それでも include_path が要るなら エントリポイント 1 箇所に閉じ込める(グローバル副作用の可視化)。
  3. パスは 絶対パス + realpath() で正規化。相対パスはデプロイ先差異で地雷化しやすい。
  4. 追加パスが増えすぎると I/O が増え性能劣化。10 本超えたら autoload へ切り替えを検討。

まとめ

include_path の動的変更は「短期的な便利さ」と「長期的な負債」のトレードオフ

  • 一時的な小スクリプトset_include_path() で済む
  • 継続運用・チーム開発 → Composer autoload + 名前空間へ段階移行

“昔の便利 hack” を いつ・どこで止めるか を設計に刻むと、あとで苦しまなくて済みます。

サンプルコード — 最小オレオレ autoloader

<?php
spl_autoload_register(function ($class) {
    $path = __DIR__ . '/lib/' . strtr($class, '\\', '/') . '.php';
    if (file_exists($path)) require $path;
});

将来的にはこの 10 行を composer.jsonautoload セクションに置き換えるだけで、本格運用への橋渡しが完了します。

FAQ

include_path ってそもそも何?

PHP がファイルを探すときに覗く “本棚” だと思ってください。require 'MyLib.php' と書くと、まずここを順番に探します。

set_include_path() と ini_set()、どっちを使えばいいの?

普段は set_include_path() がラク。区切り文字を OS ごとに考えなくていいからです。レガシーで ini_set が大量に残っているなら、後方互換を見つつ徐々に置き換えれば OK!

Composer を使えば全部解決って聞いたけど?

ほぼその通り!composer dump-autoload -o を一度打てば、クラスローダーがいい感じに解決してくれます。ただ「ちょっと動かすだけ」のスクリプトなら include_path 追加のほうが手早いことも。

追加したパスが本当に反映されたか確認する方法は?

var_dump(get_include_path());ini_get('include_path') の両方を覗いてみましょう。同じ値が返れば設定完了です。

変なファイルが require されてしまうんだけど?

include_path にディレクトリを盛り込みすぎると、PHP は “最初にヒットしたファイル” を優先します。realpath() で絶対パスに統一するか、ディレクトリ数を減らすと解決しやすいですよ。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.