• ベストアンサー

相対パスの挙動を理解できない

PHP5+Apatch2でプログラムを作成しています。 Apatch,PHP共に初心者です。 ----------------------------------------------------- index.php[1] | PHPフォルダ[1]- CLASSフォルダ[2a]- class.php[3a] |              | |              phpfile.php[2a] | LIBフォルダ[1]- lib.php[2b] ------------------------------------------- *[]内は同じ番号のものが同じ階層を表すとします。 *apatchのドキュメントルートは[1]の一つ上になっています。 とプログラムを作成して、class.php[3a]の中で require_once("../phpfile.php[2a]");を 行った場合、 No such file or directoryのエラーが発生します。 かわりにrequire_once("../PHP/phpfile.php[2a]");と 置き換えた場合は動作します。 相対パス"../"は一つ上の階層に上がると理解していたのですが、 二つ上にある階層へと移動しているように思います。 気になったので、lib.php[2b]から<a href="../index.php[1]">aaa</a> を表示させてみたところ、上手くindex.php[1]へリンクを貼れます。 apatchの設定、PHP5がおかしい、HTMLがおかしい、誤解している等、 初心者なりに予測されるものが多いので手が付かなくなっています。 原因と思われるものがあればどうかご指摘ください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まずは カレントディレクトリを調べては? <?php //カレントディレクトリの絶対パスを表示 print getcwd(); ?> 試しに 手元の Apache/2.2.3 (Unix) DAV/2 PHP/4.4.7 mod_ssl/2.2.3 OpenSSL/0.9.7l で require_once("../ひとつ上の階層にあるphpファイル"); して問題なく動作しました。 #1さんも匂わせてますけど 例えば、質問者さんの構成でPHPフォルダにあるphpファイルから class.php[3a]をrequireして そのclass.php[3a]のなかでrequireする場合は カレントディレクトリは PHP/CLASS/ではなく PHP/のままの筈です http://code.nanigac.com/source/view/303

make_midi
質問者

お礼

ありがとうございます。 umasikajiroさんのご丁寧な解説で解決しました。 以前にも同じことで躓いて、その時は解決したのですが、 なぜか今回は混乱したままでした。 getcwd();はこういった相対パスを考える場合に使いやすい関数ですね。 勉強になりました。

その他の回答 (1)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

実際にブラウザから呼び出しているスクリプトの位置は?class.php自体をブラウザからアクセスしているんでしょうか?

make_midi
質問者

お礼

申し訳ありません。 設計図等なしで闇雲に制作していたため混乱していました。 require先にあるファイルからではなく、 ブラウザがアクセスしているページからの階層を指定しなければ ならなかったのですね。 同じことで以前にも躓いて、 その時は解決したはずなのにまた躓いていました。 ありがとうございました。

関連するQ&A