PHPでrequire_onceのパスを設定する場合は、安全なパス設定にしないといけません。
では、実際に検証しつつ、説明していきますね。
こういったフォルダ構成で
1 2 |
<?php require_once('../class/User.php'); |
1 2 3 4 |
<?php require_once('../library/Validate.php'); echo 'load User.php'; echo '<br>'; |
1 2 3 |
<?php echo 'load Validate.php'; echo '<br>'; |
で、views/index.phpをブラウザで読み込んでみると、

という感じで正常に動作します。
では、次にviewsディレクトリの中にpostディレクトリを作成。
また、views/post/index.phpも作成します。
1 2 |
<?php require_once('../../class/User.php'); |
先ほどと同様に、views/post/index.phpを読み込むとエラーとなります。
Warning: require_once(../library/Validate.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/test/class/User.php on line 2
Fatal error: require_once(): Failed opening required '../library/Validate.php' (include_path='.:/Applications/MAMP/bin/php/php7.2.7/lib/php') in /Applications/MAMP/htdocs/test/class/User.php on line 2
上記のようにエラーが出るでしょう。
これは、User.phpの2行目でrequire_onceが出来なかったことによるエラーです。
PHPの相対パスの起点は呼び出し元のファイルのディレクトリからのパスになります。
つまり、実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになるのです。
ここでは、views/post/index.phpとが実行ファイルなので、そのディレクトリpostが起点です。
なので、
PHPではこのような相対パスでincludeのパスを書くと、
class/User.phpが以下のようだと、
1 2 |
<?php require_once('../library/Validate.php'); |
views/post/index.phpを実行したとき、動かなくわけです。
1 2 |
<?php require_once('../../library/Validate.php'); |
class/User.phpを上記のように修正すると、views/post/index.phpは動きますが、
今度はviews/index.phpを実行したとき、エラーとなるでしょう。
そこで、パスの設定を相対パスではなく絶対パスに変えることで解決します。
具体的には、
1 2 |
<?php require_once(dirname(__FILE__) . '/../../class/User.php'); |
1 2 |
<?php require_once(dirname(__FILE__) . '/../class/User.php'); |
1 2 3 4 |
<?php require_once(dirname(__FILE__) . '/../library/Validate.php'); echo 'load User.php'; echo '<br>'; |
とすればOKです。