- ベストアンサー
(初級)require等で共通ファイルを読み込む場合のパスの書き方で…。
単純な質問です。 定数ファイル等、共通のファイルを、サイト内のPHPファイル全てで読み込みたい場合の方法について。 example.com /index.php /[const]/main.php /[page]/index.php ※[ ]はディレクトリを表す サイトexample.comにおいて、 トップページ index.phpと、 /[page]以下のindex.phpで、 同じ定数ファイルを読み込みたいとします。 例では、/[const]/main.php を読み込もうとしています。 ------------------------------ index.phpのスクリプト内では、 require_once 'const/main.php'; ------------------------------ と書け、 ------------------------------ /[page]/index.phpのスクリプト内では、 require_once '../const/main.php'; ------------------------------ と書くことになるかと思います。 このとき、読み込むファイルのパスが両者で異なりますよね。 (「../」が有るか無いかで異なる) これを、共通化したいのですが、可能でしょうか? つまり、例えばですが、 require_once 'COMMON_FILE'; と書けば、どちらのスクリプトファイルにおいても、 正しいパスが読み込まれる、というような。 また、サイトドメインが変更されても、書き換えなくて済むようにしたいです。 (例)example.com → example.net へ移動しても、書き換え要らずの方法で、何か方法を教えて下さい。 とっても、初歩的なことをお聞きして、すみません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>require_once $_SERVER["SERVER_NAME"].'/const/main.php'; なるほど。 であれば、 require_once $_SERVER["DOCUMENT_ROOT"]."/const/main.php"; としたらいけそうですね。 DOCUMENT_ROOTの上にライブラリを置くことになったら少々面倒ですが。
その他の回答 (3)
- kaze2com
- ベストアンサー率50% (6/12)
__FILE__(定義済みの定数) とかで自分自身のフルパスを参照すると、幸せになれるかもです。あとdir()とか。
お礼
>__FILE__(定義済みの定数) 試してみました所、自分自身のところまでパスが来てしまうので、 ちょっと行きすぎでした。(幸せを逃しました。) しかし、今後、何かには使えそうだなと感じました。 私にとって、この__FILE__は、 知っているようで意外と使えていない定数でした。 >あとdir()とか これも初めて使ってみました。 仕様については何となく掴めましたが、 残念ながら、それを今回の場合においてどう利用すると、 幸せになれるのかが分かりませんでしたので、 ここでも幸せを逃しました。 しかし、頂いた1文から、多くの事を学ぶことができました。 ありがとうございます。
- JavaJavax2
- ベストアンサー率22% (68/305)
よくわかんないけど、環境変数で絶対パス拾ってきて絶対パスで指定したら書き換えはしなくてすむんじゃないかなぁ require_once $_SERVER["DOCUMENT_ROOT"]."/index.php"; 普通にインクルードできましたよ? set_include_path ( string $new_include_path ) 使ったてよさそうなのになんでだめなん?
お礼
>環境変数で絶対パス拾ってきて絶対パスで指定したら書き換えはしなくてすむんじゃ そうみたいですね^^ 初めて知りましたが、使えそうですね。 皆さん、よく使われる方法なんでしょうかね。 >set_include_path ( string $new_include_path ) ほぉ。。。 そんな技もあるのですか。。 ちょっと調べてみました。 ----------------------------------- <?php // PHP 4.3.0 以降で動作します set_include_path('/inc'); // すべてのバージョンの PHP で動作します ini_set('include_path', '/inc'); ?> ------------------------------------ というのを発見。 include_pathをスクリプト単位で変更できるようですが、 例えば、ディレクト全体で一括に変えられるのであれば、 そちらの方が楽そうですね。 あ~、この、 include_pathの設定をするスクリプト自体を ファイルとして外に出し、 それをディレクトリ内のファイルに読み込ませておけば、 適宜、ディレクトリ単位で、include_pathの一括変更が可能そうですね。 ファイルの配置をダイナミックに移動させることが時々あるのですが、 その際に、「ソースの書き換えを行わなくて済む」方法があると 良いなと思っておりまして、 そうなると、やはり、$_SERVER["DOCUMENT_ROOT"]がベストなのでしょうかね。 [const]の配置位置や、[const]main.phpの配置位置がフラフラするようだと、 この「絶対パスによる方法」も、怪しくなってきますが、 どちらかと言うと、そういうフラフラよりかは、 [const]main.phpを読み込む側の複数あるファイルの中のどれかが サイト内をダイナミックにフラフラすることの方がよくあるので、 相対パスよりか絶対パスで対処する方が得策な気がしてきました。 ただし、 ドキュメントルート以下で対応する場合に関しては、ですけども。 参考になりました。ありがとうございます。
- hogehoge78
- ベストアンサー率80% (433/539)
php.iniでinclude_pathを書き換えるという方法が使えない状態で、 相対パスでないと引けない状態ということですと、 そのディレクトリ構成では無理です。 といったところで方法思いつきました、凄く微妙ですけど。 pageディレクトリに、constディレクトリを作ってその中に、ダミーのmain.phpを作成してやって、その中身は、 <?php require_once '../../const/main.php'; ?> とだけ記述されていると。 つまり、ダミーのmain.phpをインクルードして、ダミーのmain.phpが本物のmain.phpを読んでくると。 そうすれば、今後以降や構成変更を行う場合でも最小限の労力ですむ・・・・かもしれません・・・・ これ以外の方法ですと、MVC構成のフレームワークなどであるフロントコントローラ+mod_rewriteなんかでアクセス制御したりするのがいいのかなぁってところでしょうか。
お礼
思っていたよりも、根の深い問題だったのですね。^^; ということは、皆さん、それなりに苦労されているのでしょうね。苦笑 >php.iniでinclude_pathを書き換えるという方法が使えない状態で、 相対パスでないと引けない状態ということですと、 そのディレクトリ構成では無理です。 include_pathを書き換える方法の他に、 .htaccessファイルで対応できたりはしませんでしょうか。 やはり、対応できない類の設定なのでしょうか…。 >require_once '../../const/main.php'; 結局、ここに、くせ者が居るわけですね。笑 私が最初考えたのは、 つまり、動的にインクルードできるような仕組みにしたい ということなので、 読み込むファイル名(ファイルパス)を、動的な絶対パスで作成できないか、 というものです。 例えば、 require_once $_SERVER["SERVER_NAME"].'/const/main.php'; というような書き方です。 (もちろん、これではダメでしたが。) でも、考え方的には、良い感じではありませんか? >MVC構成のフレームワークなどであるフロントコントローラ+mod_rewriteなんかでアクセス制御 この辺りの読んでいる時の私の目は、白目でした。笑 つまり、まだよく分からないという…。苦笑 しかし、いつかのために、有り難く頭に入れておきます!
お礼
$_SERVER["SERVER_NAME"]ではなく、 $_SERVER["DOCUMENT_ROOT"]でしたか。笑 これならいけそうでしょうか。嬉しいです^^ >DOCUMENT_ROOTの上にライブラリを置くことになったら少々面倒 あ~、そういう技(セキュリティを意識した)もあるみたいですよね~。 確か、XOOPSにそんなのがありました。 ライブラリの位置的に問題がなさそうであれば、 $_SERVER["DOCUMENT_ROOT"]で、ちょっとやってみようかと思います。