[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 メーリングリストの案内