PHPで多くのファイルを include (または require )したい場面はよくあります。
例えば共通で使われるテンプレートを全てのページでインクルードしたり、あるいは外部のライブラリをインクルードしたり・・・
そういう時にフォルダ単位で include・require する方法とコード例をまとめました。
glob関数を使うのが一番簡単
フォルダ単位の読み込みには glob関数 を使うのが一番簡単ですね。
glob関数というのはlibcのglob関数で使われるパターンにマッチするファイルパスを返す関数のこと。
正規表現のパターンとは少しだけ違います。例えば preg_match などに渡すパターンは // (スラッシュ2つ)で囲む必要がありますが、こちらの関数はその必要はありません。
このglob関数を使ってフォルダ単位で読み込みさせる方法は次の通りです。
まず次のようなフォルダとファイル構成があるとしましょう。
1 2 3 4 5 |
- app - views - header.php - footer.php - sidebar.php |
いわゆるMVCモデルだとviewsフォルダに共通で使うテンプレートファイルを定義するので、そういうのだと思ってください。
このケースでviewsフォルダ内のファイル全てを include するコードは次の通り
1 2 3 4 5 6 |
/** viewsフォルダ内を全てinclude */ $pattern = 'app/views/*.php'; foreach ( glob( $pattern ) as $filename ) { include $filename; } |
まずviewsフォルダ内の全PHPファイルに当てはまる 'app/views/*.php' というパターンを作成。ちなみに先ほど書いたようにパターンは // で囲む必要はありません。
そして glob( $pattern ) でファイル名リストを取得し、 foreach の中で1つずつインクルードしていくという流れになっています。
自分もつい最近知ったんですが、この方法はスマートで使いやすいです。
glob関数でincludeする時の注意点
ただしこのglob関数を使って include・require する方法には1つ注意点があります。
それはリモートファイルは指定できない、ということ
リモートファイルっていうのは簡単に言えばURLとほぼ同じです。glob関数にはURLを渡すことができず、渡せるのはファイルパスのみです。
例えば次がhttpsプロトコル付きで include しているエラーになるコード例
1 2 3 4 5 6 |
/** リモートファイルをincludeしている例(エラー) */ $pattern = 'https://example.com/app/views/*.php'; foreach ( glob( $pattern ) as $filename ) { include $filename; } |
こういう風にURLそのものを渡すことはできないので要注意。
この場合に限った話じゃないですが、 include とか require する時はプロトコルをつけずに読み込みした方が余計なエラーが起きにくいです。
ちなみにもし絶対パスでファイルを指定したい場合は $_SERVER['DOCUMENT_ROOT'] でドキュメントのルートパスが取得できます。
例えば次がルートからのパス指定でviewsフォルダごと include しているコード
1 2 3 4 5 6 |
/** URLを使わずに include する例(成功) */ $pattern = $_SERVER['DOCUMENT_ROOT'] . '/app/views/*.php'; foreach ( glob( $pattern ) as $filename ) { include $filename; } |
$_SERVER['DOCUMENT_ROOT'] はURLでいえばドメイン直下のパスになるので、あとはそれにフォルダやらファイルの相対パスを書けばOKです。
glob関数を使うときはURLは使わないように気を付けた方がいいですね。
ここまでのまとめ
ということでフォルダ単位の include ・ require についてまとめ
- glob関数を使うのが一番楽
この関数に 'app/view/*.php' みたいなパターンを渡すことで該当する全てのファイル名リストを返してくれる。後は foreach など使って include すればOK
- ただしリモートファイルは指定不可
例えばプロトコル付きの 'https://xxx.com/app/views/*.php' みたいなパターンは指定できない。絶対パスで指定するなら $_SERVER['DOCUMENT_ROOT'] を使うこと
もし全部手動で include したり require すると大変ですが、これを使えば動的に読み込みできます。大量のファイルを扱う時に大活躍しそうなテクニックです。
以上、PHPでフォルダ単位でファイル読み込むする方法についてでした。ではでは