2014-01-23 38 views
0

讓我首先演示我的文件結構。
爲什麼兩級PHP只包含當前目錄下的工作?

/www/ 
    myfile.php 
    anotherC.php 
    a/ 
     b.php 
     c.php 

myfile.php的代碼是:

<?php 
    include_once("a/b.php"); 
?> 

b.php的代碼是:

<?php 
    include_once("c.php"); 
?> 
c.php

最後:

<?php 
    echo "hello i'm C.php"; 
?> 

所以,當我打電話www/myfile.php我得到的輸出:

hello i'm C.php

這些作品的罰款。但是,讓我改變b.php

<?php 
    include_once("../anotherC.php"); //or include_once("./c.php"); (it won't work too) 
?> 

現在,當我打電話www/myfile.php,我得到錯誤:

Warning: include_once(../anotherC.php): failed to open stream: No such file or directory in /home/hasib/Desktop/www/a/b.php on line 2 Warning: include_once(): Failed opening '../anotherC.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/hasib/Desktop/www/a/b.php on line 2

現在我的問題是,爲什麼在include_once("c.php");工作完美?

+0

什麼是您的include_path設置爲? –

+0

我的推薦:使用絕對路徑,從文檔根開始('_ _ SERVER ['DOCUMENT_ROOT']')。好處是:你可以避免頭痛;您可以移動文件而不必關心更改實際代碼中的路徑;如果您刪除中間文件,您仍然可以訪問最後一個文件。等等... – aleation

+0

@AlexHowansky,我包括路徑是:在/ usr /共享/ PHP:在/ usr /共享/梨 –

回答

0

包含相對路徑始終是相對於MAIN腳本完成的。 include()的操作方式基本相同,如果你將'n'直接粘貼到主腳本中。因此,當您執行子包含時,他們正在使用myFile.php腳本的工作目錄,而不是b.phpc.php的工作目錄。

你的子腳本需要在他們的icnldues中有一個絕對路徑,或者至少有某種「我到哪兒」的確定代碼,例如, include(__FILE__ . 'c.php')

+0

這並沒有回答這個問題:*爲什麼'include(「c.php」)'work *? –

+0

是的,爲什麼'include(「c.php」)'工作?查看php.net周圍後,現在我知道如何安全地包含文件。但是,'include(「c.php」)'如何工作,而它應該不起作用。 –

0

我能想到這項工作的唯一原因是您的include_path中有/www/a。這意味着include_once("c.php")首先會查找/www/c.php(因爲這是當前的工作目錄),然後查找/www/a/c.php哪些可以找到並工作。

但是,include_once("./c.php")明確規定只查看當前工作目錄,當然由於該文件不存在,所以不起作用。

+0

:(據我所知,我的include路徑是'。/ usr/share/php:/ usr/share/pear' –

1

document

If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing.

If a path is defined — whether absolute (starting with a drive letter or \ on Windows, or/on Unix/Linux systems) or relative to the current directory (starting with . or ..) — the include_path will be ignored altogether. For example, if a filename begins with ../, the parser will look in the parent directory to find the requested file.

的 '調用腳本' 在你的例子是b.php,顯然這是directoy是 '/ WWW/A /'。

你可以使用GETCWD()來獲得 '當前目錄',無論是在myfile.php或b.php,它將返回 '/網絡/'

所以當include_once( 「c.php」) ;它首先在調用腳本的目錄中查找c.php,即/ www/a /,併成功獲取c.php。

include_once(「../ anotherC.php」); ,它只會在當前目錄的相對路徑中查找另一個C.php,當前目錄是/ www /,因此它會在/,/ anotherC中查找另一個C.php。PHP不存在並拋出警告。

+0

在include_once(「../ anotherC.php」)的第二種情況下,爲什麼當前目錄是'/ www /'???是不是'/ www/a /'如前所述?? (據我所知,當前目錄總是「/www /「[在這兩種情況下]當前正在執行的文件('myfile.php')存在。) –

+0

@HasibAlMuhaimin請注意'當前目錄'和'調用腳本目錄'之間的區別,你可以得到'當前目錄'通過getcwd(),正如我所說的,結果總是/ www/as yu知道。 – leo108

+0

@HasibAlMuhaimin如果路徑以..開頭(就像../anotherC.php),php只查找相對路徑爲'當前目錄' – leo108

相關問題