PHPでの共通ファイルの呼び出し方をまとめました

2012年10月29日

PHPを使ってると、というか動的にサイトを作っているとかなりの確率で「毎回呼び出してるあのファイルへのパスが階層によって変えないといけないのがめんどくせー!!」と思う事があると思います。僕はあります。

例えば、共通で使う設定ファイルとか、テンプレートファイルを別のフォルダに置いてる場合とかに、それらを呼び出したい場合とかですね。

しかも設定ファイルでさらに別のファイルをインクルードしたりするともうめんどくさいんですよね。

//こんな階層構造の場合
htdocs/
 ├lib/
 │└set.php ←これが共通で読み込むファイル
 │└aaa.php ←共通ファイルがこれを読み込む
 └index.html ←これにアクセス

//他にもこんなの
root/
 ├htdocs/
 │└index.html
 └lib/
  ├set.php
  └aaa.php

index.html をリクエストしたと想定して、各ファイルの呼び出し方をまとめてみました。

アクセスしているURLからの指定

普通に「一つ上のフォルダ」だったら「../」とかを記述すれば良いですね。これはhtmlでもよくある書き方です。

ただ、ファイルをインクルードする場合、いちいちパスを書き換えるのが面倒だって事になってきます。えぇ、絶対なります。

ドキュメントルートからの指定

この場合、アクセスするファイルの階層が変わると、インクルードするパスも変更しないと行けなくなってしまい、結構面倒です。たかだかそれだけが面倒なのかお前はと思われた方、プログラマなんてそんなもんです。一秒だって面倒な事はしたくないんです。そういう生き物です。許してやって下さい。

さてそんな面倒な事に対して、一応解決策があるんです。それは次ような指定方法です。

// これでドキュメントルートが指定出来るみたい
$_SERVER['DOCUMENT_ROOT']

これは、共通ファイルをインクルードする場合などに使えますね。いやーすげー便利です。何で今まで誰も教えてくれなかったんでしょうか。

こうやって毎ファイルの先頭でインクルードしましょう。

<?php include($_SERVER['DOCUMENT_ROOT']."/lib/set.php"); ?>

ただこれ、欠点としてはドキュメントルート外のファイルは読めないみたいです。んー、残念。

パスを書いてるファイルからの指定

URLに書かれているファイルから別のファイルをインクルードする場合はいままでの書き方で良いんですが、インクルードしたファイルから、さらに別のファイルをインクルードしている場合は要注意です。

//index.html URLに書かれてるファイルからインクルード
<?php include("./lib/set.php"); ?>

// /lib/set.php インクルードしたファイルからさらにインクルード
<?php include("./aaa.php"); ?>

何に注意しないといけないかというと、さらにインクルードする場合は相対パスの指定の仕方が「インクルードを書いてるファイルからの相対パス」ではなく、「アクセスしているURLからの相対パス」になってしまいます。

// これは間違い
<?php include("./aaa.php"); ?> 
↓
// これが正しいパスになります
<?php include("./lib/aaa.php"); ?> 

こうしないとエラーになってしまいます。

// 階層的にはこんな感じです
htdocs/
 ├lib/
 │└set.php ←2. ここに include("./aaa.php") を書く
 │└aaa.php ←3. ここにアクセスしたい
 └index.html ←1. これにアクセス
 ─aaa.php ←4. index.htmlから見ての ./aaa.php と認識する

何かめんどくさいけどそういうもんです。諦めましょう。

なので、そういう時は一般的にはこういった指定方法になります。

<?php include(dirname(__FILE__)."/aaa.php"); ?>

これで、アクセスしたURLからパスを数えるのではなく、その記述が書かれているファイルからのパスになります。

これ、何が便利かというと、例えば /lib/ というフォルダ名を変更する必要があって、 htdocs/common/lib/ になったとします。

その場合、相対パスで記述した場合は、 set.php に書かれているインクルードパスも全部書き直しなのですが、 direname(__FILE__) をつかうと、書き直す必要がなくなります。これはひとくくりになったライブラリを他のサイトで使い回すときに凄くありがたいですよ。

まとめ

読み込みたいファイルがドキュメントルート配下にしかない、CakePHPとかWordPressみたいなフレームワークだと

// ↓各ファイルに記述する設定ファイルのパス
include($_SERVER['DOCUMENT_ROOT']."/lib/set.php);

// ↓設定ファイルに記述する他ファイルのパス
include(dirname(__FILE__)."/classController.php");

を使えばルート相対パスと同様の記述で良いから楽で良いですね。

これだと /lib/ 配下はどのサイトでも使えて良いですね。

そして、読み込みたいファイルがドキュメントルート外だと、一度相対パスで設定ファイルを読み込んで、設定ファイル内のファイルにパスからの指定で他のファイルを読み込んであげるかたちの

// ↓各ファイルに記述する設定ファイルのパス
include("../../lib/set.php"); (適宜変更はやむなし)

// ↓設定ファイルに記述する他ファイルのパス
include(dirname(__FILE__)."/classController.php");

という運用にすると良いのかなぁと思いました。

他にこんな事も書いてます

FBでコメント

3個のコメント

  1. 書いたよ:PHPでの共通ファイルの呼び出し方をまとめました – http://t.co/9pM7CzvS

  2. @miwo_k より:

    SS | PHPでの共通ファイルの呼び出し方をまとめました http://t.co/8xVaMq3H @anticyborgさんから

  3. @jyugobeger より:

    SS | PHPでの共通ファイルの呼び出し方をまとめました http://t.co/l5e1OQx3 @anticyborgさんから

トラックバック/ピンバックはありません。