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 などの前には必ず / をつける必要がある。