[PHP-users 30425] Re: 相対パスについて
Matsumoto Taichi
taichino @ naoko-takeuchi.net
2006年 9月 26日 (火) 18:12:33 JST
松本です。
tokuyama 様
鈴木 様
返信が大変遅くなってしまい申し訳ありません。(約1ヶ月も・・・)
(実務が火を噴いてしまい、淡々とデスマーチを歩む日々でした。。)
さて問題となっていたことをもう一度調査してみました。
話題も飛んでしまいましたので、結論だけを書かせていただきます。
[結論]
require_onceでファイルを読み込んだ場合、
一番初めにrequire_onceを呼び出したファイルのディレクトリが
カレントワーキングディレクトリとして指定され続けるようです。
ですので、
----ディレクトリ構成例-----------------
[parent_dir]
┣parent.php
┣define.php
┃
┗[child_dir]
┗child.php
---------------------------------------
のような構成で、以下のように
parent.phpからchild.phpをrequireしたときに
child.phpからdefine.phpがrequireされていると、
child.php内でrequire_onceが解決されるときの、
カレントディレクトリが[parent_dir]となってしまうため、
define.phpが見つからないという状態になってしまうようです。
-----parent.php------------------------
require_once('child_dir/child.php');
---------------------------------------
-----child.php------------------------
require_once('../define.php');
---------------------------------------
[正しい解決?と思われる案]
以上の理由から一番の解決策は参照関係をきちんと設計し、
その上でコーディングを進めるということかと思います。
(親ディレクトリ⇒子ディレクトリのrequireを禁止するなど。)
[無理やり解決案]
ただ、そんなに悠長なことを言っていられない場合は
以下のようにして無理やり解決可能のようです。
-----parent.php------------------------
chdir("./child_dir");
require_once("child_dir/child.php");
chdir(dirname(__FILE__));
---------------------------------------
require_onceを呼び出す前に、呼び出すスクリプトのパスを
カレントディレクトリに設定し、その後元に戻すという方法です。
かなり汚いので微妙ですが、最悪の場合はこれで逃げられます。
また幾つかのうまく動かない相対パスのバリエーションを確認できましたが、
基本的に現状のカレントディレクトリ(getcwdの結果)をトレースすれば
解決することが出来ました。
ご助言いただきました皆様、本当にありがとうございました。
C言語系と同じ動作を期待していたために、
問題の切り分け時に思い込みが強く反映してしまっていました。
まだまだ精進が足りないようです。
以上、よろしくお願い致します。
------------------------------------------------------------
Matsumoto Taichi : taichino @ naoko-takeuchi.net
------------------------------------------------------------
PHP-users メーリングリストの案内