2011-06-12 13 views
3
[email protected]:~/php$ ls 
a.php data include 

[email protected]:~/php$ tree 
. 
├── a.php 
├── data 
│ └── d.php 
└── include 
    ├── b.php 
    └── c.php 
2 directories, 4 files 

[email protected]:~/php$ cat a.php 
a.php is including include/b.php ... 
<?php include "include/b.php" ?> 

[email protected]:~/php$ cat include/b.php 
b.php is including c.php and ../data/d.php ... 
<?php include "c.php" ?> 
<?php include "../data/d.php" ?> 

[email protected]:~/php$ cat include/c.php 
c.php 

[email protected]:~/php$ cat data/d.php 
d.php 

[email protected]:~/php$ php a.php 
a.php is including include/b.php ... 
b.php is including c.php and ../data/d.php ... 
c.php 
PHP Warning: include(../data/d.php): failed to open stream: No 
such file or directory in /home/disc/php/include/b.php on line 3 
PHP Warning: include(): Failed opening '../data/d.php' for 
inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/ 
disc/php/include/b.php on line 3 

[email protected]:~/php$ 

なぜinclude "c.php"は成功しますが、include "../data/d.php"は失敗しますか?このPHP相対インクルードが失敗するのはなぜですか?

http://www.php.net/manual/en/function.include.phpは言及:「パス が定義されている場合は - 絶対かどうか( Windows上のドライブ文字または\で始まる、または/ UNIX/Linuxシステム上で)、または現在の ディレクトリからの相対(で始まりますか。 。) - のinclude_pathは全く を無視されるファイル名が../で始まる場合たとえば、パーサ は、要求されたファイルを見つけるために、親ディレクトリになります」何の

親ディレクトリを。。?

答えて

2

パスは常に呼び出されたスクリプトからの相対パスです。あなたの例では、 "。" (カレントディレクトリ)は常にinclude_pathにあります。

これを修正するには、dirname(__FILE__)を使用して、ファイル自体のディレクトリを常に知ることができます。 (FILE

を入力するか、dirname($_SERVER['SCRIPT_FILENAME'])を使用して、カリングスクリプトのディレクトリを取得することができます。

+0

をしかしでc.phpではありませんカレントディレクトリ。現在のディレクトリは '/ disc/php'です.c.phpは'/disc/php/include'にあります。 –

+0

私の質問では、a.phpが呼び出され、すべてのパスがa.phpに相対的なスクリプトになりますか? –

+0

c.phpはインクルードファイルを呼び出すファイルのカレントディレクトリにあります。 (b.php) – Rufinus

1

あなたはa.phpで開始しているとして、あなたはa.phpにディレクトリを含める定義する必要があります:

define('MY_INCLUDES', dirname(__FILE__) . '/include/'); 
define('MY_DATA', dirname(__FILE__) . '/data/'); 

その後、絶対パスを持つファイルが含ま:

include(MY_INCLUDES . 'b.php'); 
include(MY_DATA . 'c.php'); 
関連する問題