PHPでrequireしたファイルが読み込めない時!
とあるPHPの実行ファイルがあって、その中で別のクラスを読み込んでいます。
読み込んだクラスの中でこれまた別のjsonファイルを読み込もうとするが、
なぜか読み込めずにちょいハマり。。。
ディレクトリ構造はこんな感じ
[DocumentRoot]/index.php [DocumentRoot]/auth/Auth.php ...クラス [DocumentRoot]/json/data.json ...jsonファイル
index.php(実行ファイル)
require("./auth/Auth.php");
Auth.php
var_dump(file_exist("../json/data.json"));
実行するとfalseが出力され、ファイルが存在しないことになっていました。
理由は簡単、PHPでは実行ファイルのディレクトリがカレントになるというルールがあるからです。
file_existはAuth.phpのディレクトリではなく実行ファイルであるindex.phpのディレクトリを基に、[DocumentRoot]/../json/data.jsonを参照しようとしてnon existになっていた、ということでした。
なので、理屈上はこのように書かないとダメみたいです。
Auth.php
var_dump(file_exist("./json/data.json"));
※includeでも同じ
ただしクラスの性質を考えると、__DIR__やdirname(__FILE__) といったPHPのコアで定義されている定数を使って上手く
表現したほうがベターだと思います。
PHP: 自動的に定義される定数 - Manual
ちょっと前に職場の上司が言っていた「cronでPHPを叩くときは絶対パスで書けよー」という言葉を思い出したのが
解決のきっかけだったのですが、何がともあれ基礎って大事だなあとつくづく思いましたね(´・ω・`)ノ