TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

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を叩くときは絶対パスで書けよー」という言葉を思い出したのが
解決のきっかけだったのですが、何がともあれ基礎って大事だなあとつくづく思いましたね(´・ω・`)ノ