過去にいくつかの PHP フレームワークのソース コードを見たとき、ファイルがインクルードされるときにファイル パスを結合するために dirname(__FILE__) が使用されていることが奇妙でした。そうすることの利点がわかりませんでした。しかし、ついにその理由が分かりました。
簡単な例を見てみましょう:
php ファイルは a、b、c の 3 つあります。 a.php は Web サイトのルート ディレクトリにあり、b.php は b フォルダー (b/b.php) にあり、c.php は c フォルダー (c/c.php) にあります。何かの混乱?写真を見れば一目瞭然です
a.php と b.php には両方とも c.php が含まれており、最後に c.php には d フォルダー (d/d.php) に php ファイルが含まれています。
まず a.php を見てみましょう:
リーリーこれは非常に単純なコードです。印刷後、c/c.php を確認する必要があります。 リーリー
「これは c.php です。a.php で必要です」という出力を印刷します。$file_name は a.php で定義された変数です。最後にd.phpがインクルードされます。 dフォルダは現在のc.phpファイルの一つ上にあるので、常識的には当然パスは「../d/d.php」と書きます。ただし、残念ながらエラーが報告されます。その理由は、c.php などのインクルード ファイルに他のファイルをインクルードする場合、そのパスは最も外側の親ファイル、つまり a.php を基準とした相対パスになり、あなたが私にインクルードされていると理解できるからです。 , だから、あなたは私を頼らなければなりません。非常に謎に思えますが、原理は実際には非常に単純です。require('c/c.php'); を c/c.php ファイル内のコードとして考えることができ、a.php は次のようになります。 :リーリー
この時点で、d/d.php ファイルをインクルードしたいときのパスが間違っていることがわかりますか?ここでは a.php コード内にいるため、a.php ファイルに対する相対パスになります。もちろん、パスは require('d/d.php'); である必要があります。コードを次のように変更します:リーリー
この時点ではまだ意味を理解していないので、b/b.php を見てみましょう:
リーリー
説明の必要はありませんが、問題はありませんが、require('../c/c.php'); を c/c.php のコードに置き換えると問題が発生します。注意してください。 c/c.php のコードを変更し、require('../d/d.php'); を require('d/d.php') に変更しました。以下のコードを見てください。 リーリーつまり、b/b.php と比較すると、require('d/d.php'); のパスは間違っており、require('../d/d.php'); である必要があります。戻って c/c.php の require パスを変更すると、b/b.php は正常に実行できるが、a/a.php は c を共有できないというのは本当ですか。 /c? .php、全身に影響します、どうすればいいですか?
この時点で、記事の冒頭で述べた dirname(__FILE__) に戻ります。これは良いことであり、上記の問題を完全に解決できます。これを使用すると、どのファイルにファイルが含まれているか、またそのファイルがどのパスにあるかを気にする必要がなくなります。 dirname(__FILE__) で相対パスを指定できるため、親ファイルのレベルを気にする必要がなくなります。現行ファイル。つまり、c/c.php の require パスを次のように変更する必要があります:
リーリーここでは、c/c.php を参照するだけで済みます。それに比べて、d/d.php は上位にあります。このように、基準は 1 つだけです。つまり、あなたが私を含めるか、彼が私を含めるかに関係なく、私は自分自身を基準としてのみ使用し、含めたいファイルは自分自身に対して相対的なものにすぎません。
dirname(__FILE__) が理解できない実践者の方は、Google で検索してください。非常に簡単です。
これで PHP テクノロジーの共有は終了です。ご質問や間違いがございましたら、メッセージを残してください。ちなみに、これは私の最初の標準的な技術ブログ投稿です。最初の記事は水文学、二番目の記事は準技術記事、そして今日はついに技術記事を書きました、Ou Ye。
http://www.bkjia.com/PHPjc/738506.html