PHPで多段includeするときの話
嵌ったのでメモ
test/ |-exam/ | |-main.php | |-lib/ |-class.php | |-config.php
ってプログラムがあって、
main.php
include_once('../lib/class.php');
class.php
include_once('./config.php');
config.php
define('SERVER_NAME','localhost');
main.php から class.php 、 config.php と include_once してる場合、main.php を開くと
Warning: include_once(./config.php) [function.include-once]: failed to open stream: No such file or directory
と表示される。
PHP では実行されているファイルのあるパスが常にカレントディレクトリになるという規則があるために、上記の用に多段で include した場合、main.php と同じディレクトリに config.php があると解釈されてしまう。
この場合、class.php で、
include_once(dirname(__FILE__) . '/config.php');
としておくと、問題なく config.php を読んでくれる。
__FILE__ は PHP の定数でファイルのフルパスとファイル名で、インクルードされるファイルの中で使用された場合にはインクルードされるファイルの名前を返す。
dirname はファイルあるいはディレクトリへのパスを含む文字列を受け取って、 親ディレクトリのパスを返す。 dirname が返すパスの最後に / はつかないので、config.php などの前には必ず / をつける必要がある。