[php] requireした時のcurrent-pathはどうなるのか?

こんにちわ。
下駄です。
「php」とかけまして、
「古井戸」と、ときます。
そのココロは・・・
古い技術だけど、便利なためよく使われています。
本日の疑問
色々な言語で、component構成が当たり前のようになってきているので、
プログラムファイル管理自体をマイクロシステム化する構造体が非常に便利に思えてきました。
そんな構造を実現するために、phpでは、requireで、ライブラリphpファイルを読み込んで便利にメモリ構築するわけですが、
起点ファイルと読み込みファイルで、それぞれファイル読み込みや保存をする際のローカルパスはどのようになっているのか、疑問に思えてきました。
もっと具体的に言うと、
1 2 3 4 5 6 7 8 9 10 11 12 |
a.php └ dir1/b.php # a.php ``` require "dir1/b.php"; ``` # b.php ``` file_put_contents("save.txt" , "hoge-hoge"); ``` |
とした時に、save.txtは、
/save.txtに保存されるのか?
/dir1/save.txtに保存されるのか?
という事がふと疑問に思ったので、ちょこっと調査してみたいと思います。
実行した結果・・・1
ファイルは、/save.txtに現れました。
どうやら、読み込み元の帰属するようですね。
次なる課題・・・
そこで、次の疑問は、数珠つなぎになった場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a.php └ dir1/b.php └ dir2/c.php # a.php ``` require "dir1/b.php"; ``` # b.php ``` require "dir1/dir2/c.php" ``` # c.php ``` file_put_contents("save.txt" , "hoge-hoge"); ``` |
このような、3改装にした場合です。
あまりこういう構造にする必要がないのですが、疑問に思ってしまったら、調べるしかありません。
実行した結果・・・2
無事に想像通り、root階層にファイルが現れました。
大本の呼び出し元に帰属するようです。
思い立ったが吉日
b.phpでrequireする時に、
require “dir1/dir2/c.php”
と書いているので、起点からの相対パスを意識しなければいけないことがわかります。
でも、それぞれのファイル自身を起点にしたい場合は、以下のようにするといいようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a.php └ dir1/b.php └ dir2/c.php # a.php ``` require "dir1/b.php"; ``` # b.php ``` require __DIR__."/dir2/c.php" ``` # c.php ``` file_put_contents(__DIR__."/save.txt" , "hoge-hoge"); ``` |
phpにおける__DIR__は、「マジカル定数」と言って、自動定義される定数で、こうした固定値を取得するのに使われます。
その他にも便利に使えるマジカル定数がいくつかあるので、覚えておくと便利でしょう。
参考
マジカル定数(マジック定数)簡単まとめ
https://wepicks.net/phpref-magicteisu/