#require_onceで相対パスで開けないときは__DIR__を使えば良いんじゃ...
##require_onceで相対パスは合っているはずなのに開けない
最初に遭遇したエラー。
相対パスは合っているはずなのに開けない。
/
- A.php
- D.php
- Class/
- B.php
- C.php
上記のようなディレクトリ構造の場合を考える。
B.phpでC.phpを読み込み、さらにA.phpでB.phpを読み込むとエラーが発生する。「PHPでは、「実行したファイルのあるディレクトリが常に実行時のカレントディレクトリになる」っていう規則があるためエラーとなってしまうのです。 この問題は、実行ファイルのディレクトリではなく、参照しているファイルのディレクトリを基にパスを取得することで回避できます。」
A.phpを実行しているので、 B.phpのrequire_once(“C.php”)はA.phpと同階層のC.phpを探してエラーになるようです。
https://blog.leko.jp/post/fix-require-relative-path-of-php/
調べるとどうやらrequire_onceは絶対パスを使用した方が良いとのこと。
それには、
**require_once(dirname(__FILE__) . '/C.php')**とする方法と
**require_once(__DIR__ . '/C.php')**とする方法がある。
dirname(__FILE__)および__DIR__でカレントディレクトリ(つまり、現在のディレクトリ)を取得できる。
###dirname(__FILE__)および__DIR__とは
dirname(__FILE__)
親ディレクトリのパスを返します。 path にスラッシュが無い場合は、 カレントディレクトリを示すドット ('.') を返します。それ以外の場合は、スラッシュ以降の /component 部分を取り除いた path を返します。
https://www.php.net/manual/ja/function.dirname.php
__DIR__
そのファイルの存在するディレクトリ。include の中で使用すると、 インクルードされるファイルの存在するディレクトリを返します。 つまり、これは dirname(FILE) と同じ意味です。 ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
https://www.php.net/manual/ja/language.constants.predefined.php
__DIR__はマジカル定数(PHPで自動的に定義される定数)。
###dirname(__FILE__)および__DIR__の違いは
- dirname(__FILE__) ⇒ PHP5.2以前でも使用できる
- __DIR__ ⇒ PHP5.3以降で使用できる
##dirname(__FILE__)および__DIR__を試しているのにエラーが発生する
カレントディレクトリを確認しようとvar_dumpで確認してみると、なんと、カレントディレクトリが取得できていない!
どうやらディレクトリ名が日本語のため取得できなかったらしい。
日本語から英語に変更したところカレントディレクトリを取得できた。
###日本語名のディレクトリを使用したいときはどうすれば良いのか
basename関数では、mbrlen関数を使用しているようで、こちらでは1バイト文字かつバックスラッシュという条件のようです。こちらではdirname関数のような現象は起きません。basename(FILE)とすれば正しくファイル名が返却されます。もしdirnameと同じような処理であれば、ファイル名にディレクトリ名が混入することになります。
https://qiita.com/TaMaMhyu/items/63386f610a839b9511eb
どうやらbasenameを使用すると良いらしい。**__DIR__**に関してはそういった対処法はないため日本語表記のディレクトリは使用できなさそう。
ディレクトリ名に日本語を使うのはやめた方が良さそうだね。