- ベストアンサー
include_pathについての質問 - 質問文章
- PHPのinclude_pathについて質問です。
- 特定の状況での相対パスの書き方について教えてください。
- include_pathの設定とファイルの位置関係の関係について詳しく知りたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
お疲れ様です。 すでに出尽くしたとは思いますが、念のため。 home(これがroot「/」だとして) | +-img C.jpg | +-main A.php | +-sub | +-func B.php 単純に A.phpから見たときのB.phpは 「../sub/func/B.php」 B.phpから見たときのC.jpg 「../../img/C.jpg」 ですが・・・ 「http://localhost/main/A.php」でブラウズしていれば A.phpの位置が基点となります。 ここでA.phpで 「require_once '../sub/func/B.php';」 と取り込んでいるので、C.jpgはA.phpから見た 「../img/C.jpg」 で良いかと思います。 相対の場合はブラウズの基点が何処かを意識して記述してください。 ただ、B.phpを色々な階層に有るphpから取り込むのであれば・・・ 例として、mainの下にmain2が有ってD.phpが有り +-main A.php | +-main2 D.php D.phpからもB.phpを取り込んでいるとD.phpから見たC.jpgは 「../../img/C.jpg」 と為るのでB.phpひとつでは相対パスでは対応できません。 DocumentRootからの絶対パスで記述したほうが間違いが有りません。 「/img/C.jpg」
その他の回答 (4)
- kinta03
- ベストアンサー率41% (7/17)
お疲れ様です。 先ほどの回答の補足です。 <?php echo 'Real Path = '.str_replace('\\','/',realpath('./')).'/<br>'; ?> 上記phpをhomeに置いて実行すると 自分のレンタルサーバーでは 「/virtual/***.***.212.34/home/」 となります。 XPのApache2では 「H:/Ap2_root/home/」 となります。 何が言いたいかは、お察しが付くと思いますが HTMLでは「/」とすると「home」の事ですが phpから「/」としたときとでは意味が違いますので これに気を付けて下さい。
お礼
補足までして頂き、ありがとうございます。 >HTMLでは「/」とすると「home」の事ですが >phpから「/」としたときとでは意味が違いますので ここ、重要ですね! 混同しないよう、気をつけたいと思います。 ありがとうございました。(^_^)
- shimix
- ベストアンサー率54% (865/1590)
横から一点だけ・・ >そのため、C画像への相対パスは、 >B.phpからの相対パスで書けば良いと思っていたのです。 (略) >※今もまだ、半信半疑。笑) ブラウザは(A.phpやD.phpがincludeした)B.phpがどこにあるかなんて知りません。ましてフルパス(サーバパス)も知りません。極端な話B.phpをブラウザからアクセスできない場所に置くこともあるわけです(サーバにインストール済みのPEARライブラリなどは当然そうなりますよね)。 ブラウザは自分(ブラウザ)自身アクセスしたURLと返ってきたhtmlソースがすべてです。相対パス(DocumentRootからのパスも含む)はブラウザがアクセスしたURLから計算できなくてはいけません。 #これが理解できていないで先に進むことは厳禁です。
お礼
回答をありがとうございます。 >相対パス(DocumentRootからのパスも含む)はブラウザがアクセスしたURLから計算できなくてはいけません。 こちらのアドバイスを聞くことが出来て、とても安心しました。 また、自分で実際に、A.phpとかB.phpを作り、検証もしましたので、 もう、これで大丈夫です! ありがとうございます! ということで、階層の異なる複数のファイルからincludeされるファイルの中でのパス表記では、 特に「パスは絶対パスを使うべき」だということを今回学びました。 # 「../img/C.jpg」の階層がどうたら の件は、もう少し待ってみたいと思います。
- agunuz
- ベストアンサー率65% (288/438)
>../img/C.jpg >になりますでしょうか? > >それとも、 >aunuzさんの書かれた、"img/C.jpg" こちらでしょうか? えっと・・。どちらも「同じもの」ですよね。"../"は結局自分の位置ですから。ブラウザが「同じURL」にアクセスするのだからどちらでもいいです。ブラウザは最終的にURLにしてからアクセスしますから何の違いもありません。何故そういう枝葉末節にこだわるのかわかりません。 >階層が全く異なる2つのファイル、 >A.php、D.php それぞれから呼ばれるB.phpの中では、 >C画像の位置を、相対パスでは指定してはいけない!! >ということになりますでしょうか? DocumentRootから指定するか、$path . "/img/C.jpg"にようにしておいて$pathを呼び出し側でセットしてから呼ぶことになりますね。どちらでもお好みで。ただし後者の方法で$pathのセット忘れをするくらいならDocumentRootから指定すべきです。 というか「違う階層から同じ画像を指定する」という時点で、普通にhtmlを書く場合でもDocumentRootから書きませんかね。いちいちpathを書きかえるのも面倒でしょ?
お礼
回答をありがとうございます。 >何故そういう枝葉末節にこだわるのかわかりません。 え。 「../img/C.jpg」 と 「img/C.jpg」は同じものなんですか? 私の考え方では、両者は全くの別物でした。。。 (両者を同じモノだと分かっていながら、 ウダウダ細かいことを言っている余裕は今のところ、私にはないので、 私がウダウダ言っている場合には、 「おそらく、この質問者は両者を違うモノだと思って質問をしているのだろう」くらいに、 思って頂けると非常に助かります。) さて、話を戻しまして、 「../img/C.jpg」 と 「img/C.jpg」は同じものなのか、について。 http://www.shoshinsha.com/hp/1hour/know/pass.html こちらのサイトによると、 ・同じ階層にあるものは、そのままファイル名か「./ファイル名」 ・下の階層にあるものは、「./フォルダ名/ファイル名」 ・上の階層にあるものは、「../ファイル名」 とあります。 つまり、このサイトの説明では、 「../img/C.jpg」という相対パスは、 基準のファイルから見て、一つ上の階層にある「imgディレクトリ」の中の、 C.jpgを意味し、 一方、「img/C.jpg」だと、 基準のファイルから見て、同じ階層にある「imgディレクトリ」の中の、 C.jpgを意味することになるかと思います。 >えっと・・。どちらも「同じもの」ですよね。 これは、どういった考え方をすると、 「同じもの」になるのでしょうか。 どうか教えて下さい。 「../img/C.jpg」と書いても、また、「img/C.jpg」と書いても、 同じ動作になるということでしょうか? >というか「違う階層から同じ画像を指定する」という時点で、普通にhtmlを書く場合でもDocumentRootから書きませんかね。 質問時に書きましたが、 B.phpの中で以下のように書くと、 echo dirname(__FILE__) ; //★どう表示されるかテスト★ ~/sub/func //←のように表示される。 こうなるわけです。 そのため、C画像への相対パスは、 B.phpからの相対パスで書けば良いと思っていたのです。 (呼び出し元が、A.phpだろうと、D.phpだろうと、 B.phpからの相対パスで、C画像は正しくパス指定されると、 私は当初考えていた。※今もまだ、半信半疑。笑) でも、DocumentRootから引っ張ってきた方が、 無難そうだということが今回分かりましたので、 今後は、そちらで対応していこうかなと思います。
- agunuz
- ベストアンサー率65% (288/438)
>C画像の相対パスは、どう書いたらよろしいのでしょうか? A.phpからのpathで書くことになります。つまり"img/C.jpg"でいいてす。 画像ファイルを取得するためにサーバにアクセスするのは「ブラウザ」です。そしてブラウザはA.phpの位置しか知りません。サーバ内部でのincludeなんて知りえないし、サーバパスもわかりません。 普通は(面倒なので)DocumentRootからのpathで(つまり"/img/C.jpg")書きますけどね。
お礼
回答をありがとうございます。 >A.phpからのpathで書くことになります。つまり"img/C.jpg"でいいてす。 A.phpから見た場合の相対パスですと、 ../img/C.jpg になりますでしょうか? それとも、 aunuzさんの書かれた、"img/C.jpg" こちらでしょうか? さて、補足ですが、 もし仮に、B.phpがあるディレクトリに D.phpというphpスクリプトがあったとして、 そこの記述にも、 require_once '../sub/func/B.php'; こう書かれていましたら、まずいことになりますよね? つまり、 D.phpがB.phpから引っ張ってきました、C画像のパスである、 ../img/C.jpg というパスには、 C画像は存在しないわけですから。。。 (存在しないパスを指してしまっている。) したがって、 階層が全く異なる2つのファイル、 A.php、D.php それぞれから呼ばれるB.phpの中では、 C画像の位置を、相対パスでは指定してはいけない!! ということになりますでしょうか? >普通は(面倒なので)DocumentRootからのpathで(つまり"/img/C.jpg")書きますけどね。 これは、上記の理由からでしょうか? 基本的に、PHPのコーディングにおいて、 相対パスというのは、あまり使うべきではない? 指し示す相手が、同一ディレクトリにあるファイルにのみ、相対パス指定をする、 みたいな考え方をすべきなのでしょうかねぇ。。。 パスの絶対、相対の使い分けについて、 アドバイスをして頂けますと、とても嬉しいです。
お礼
分かりやすい回答をありがとうございます。 お陰様で、大変よく分かりました。(^_^)