2013-03-16 80 views
0

,則不會包含相關文件,但我沒有發現任何與此問題相關的帖子。 。我很抱歉,如果我錯過了相關的。PHP將包含一個與調用腳本相關的文件,但如果包含路徑包含「../」

從我從PHP的文檔,並在這裏從其他職位收集,PHP的包括(和include_once)執行以下操作:

文件包含基礎,給予或者如果沒有給出文件路徑中,指定include_path。如果在include_path沒有找到文件,包括將在調用腳本本身的目錄和當前工作目錄沒有

,最後才選中我有一個給定的目錄結構如下:

  • 的index.php
  • /DIRA(包含a.php只會和b.php)
  • /DIRB(包含c.php)

從索引。 PHP include_once "dirA/a.php"

下面是a.php只會內是什麼在起作用:
include_once "b.php"
include_once "../dirB/c.php"

的奇怪的事情:
include_once "b.php"
include_once "dirB/c.php"

下面是從a.php只會內沒有按「T工作對我來說,b.php是相對於「調用腳本自己的目錄」而被包含的,但是c.php僅被認爲是相對於當前工作d irectory(這是包含index.php的dir)。這似乎與我略有不一致。 PHP將包含一個相對於調用腳本的文件,但如果包含路徑包含../,則不會 - 爲什麼? 爲什麼../父目錄指令不是相對於調用腳本工作,而是相對於當前工作目錄?(注:我測試了它相對於CWD,但不包括在我的例子,上面的文件,只是爲了保持其清潔它的工作就好了。)

任何人都可以提供一些線索來這是爲什麼? 應該它以這種方式工作,或者這是一個錯誤?

+0

Eh。 PHP有時候很奇怪。我通常只是將應用程序的根添加到'include_path'並指定相關的所有內容。從長遠來看,它可以減少混淆,同時不會犧牲四處移動的能力。 – cHao 2013-03-16 20:38:11

+0

看起來好像你的評論可能和我打算在這個上面一樣。如果你讓它成爲答案,我會接受它... – 2013-03-17 23:45:28

回答

2

PHP在查找文件方面有點奇怪。如果您包含名稱以斜槓或點號開頭的文件,則PHP完全忽略include_path。如果一個點,它假定名稱是相對於腳本啓動的一切(即:Web服務器決定運行的那個腳本)。

如果你想指定一個相對於包含腳本而不是啓動文件的路徑,你真正想要的是一個絕對包含文件,它指定了文件的全名。這很容易處理__FILE____DIR__常量,它們反映了當前正在運行的腳本的名稱和目錄。

include __DIR__ . '/../dirB/c.php'; 

如果你喜歡,你還可以設置include_path配置設置,包括應用程序的根目錄,只是指定文件名都相對於這一點。

0

這是因爲你已經第一次包括dirA/a.phpindex.php,所以從現在開始index.php是你的基本文件,所有包括這些文件都在其中。因此,如果包括c.phpa.php這就像你從index.php

做到這一點,這就是爲什麼你得到錯誤的結果,如果你指定一個級別了"../"。它搜索index.php以上的一個等級,它什麼也沒找到。

+0

謝謝,但這並不完全回答我的問題。如果每個包含*僅*相對於index.php,則包含來自a.php的「b.php」將不起作用。 ('include「b.php」'是相對於a.php的) – 2013-03-17 00:56:32