2017-10-06 72 views
0

我有這樣的目錄樹:PHP包括文件,其中包含一個文件了目錄樹

test.php 
foodir 
`---- foo.php 
bardir 
`---- bar.php 

當我打開test.php的,包括我foo.php。然後,我想讓foo.php包含bar.php。

test.php的:

include 'foodir/foo.php'; 

foo.php:

include '../bardir/bar.php'; 

然而,當我打開test.php的,我得到:

警告:包括(.. /bardir/bar.php):未能打開流:沒有這樣的文件或目錄

我注意到,如果我改變我的目錄樹:

test.php 
foodir 
`---- foo.php 
---- bardir 
     `---- bar.php 

,然後更改foo.php到:

include 'bardir/bar.php'; 

一切正常。看起來我可以包含與當前包含文件相關的文件。
然而,爲什麼我無法前往了該文件的目錄樹?

編輯:

我知道,我可以把include 'bardir/bar.php'foo.php。它會在test.php的位置搜索bar.php。但是,如果我將文件中的foo.php包含在test.php所在目錄以外的目錄中,那麼這並不能解決我的問題。這是因爲在其他目錄中,bardir/bar.php不存在。

+0

我不知道爲什麼。我有同樣的問題一次又一次。我解決了只包含魔術常量'__DIR__'的問題。我認爲問題在於'$ SERVER ['WEB_ROOT']'這可能是每個包含文件的起始點。 – Sysix

+0

包括與包含它們的文件的文件夾無關,而是與包含在php.ini配置文件,以及(通常是因爲該路徑列表中的第一個條目是「。」)當前工作目錄(通常是正在執行的主腳本的文件夾) –

回答

0

當您使用include 'foodir/foo.php';該文件現在基本上運行在「範圍」test.php

因此,包括該文件include '../bardir/bar.php'內;

將上升一個文件夾,然後尋找bardir,其心不是有: (它看起來這樣的安排:)

parent/test.php 
parent/foodir 
     `---- foo.php 
bardir 
    `---- bar.php 

所以,正確的包括裏面foo.php使用將include 'bardir/bar.php';

總之:如果你打開test.php都包括路徑中包含的任何文件中使用的應該是相對於test.php的位置 - 而不是它們的實際位置。

PS:由於在評論中提到:包括先檢查確定包括-目錄,只有在有不匹配,該路徑被認爲是「相對」。

+0

截至編輯:是的,這是這一點 - 這就是爲什麼幾乎所有的網站都只是通過他們的index.php文件來管理'everything'的原因。因爲那樣,你就沒有這個問題,你可以從不同的「文件夾深度」訪問相同的文件,這允許你設計所有包含與index.php相關的文件。 (即使對於ajax調用,你經常可以看到訪問通過index.php以某種方式代理)(只是看到'/ comment/45568/question.php'這樣的路徑並不意味着它是一個物理路徑。這就是Url-Rewriting about 95%的時間) – dognose

0

簡單地做:

include dirname(__DIR__).'/bardir/bar.php'; 

__DIR__是第一個使用這個常量的文件/被叫的絕對目錄路徑(不管它是從包括在內),從而__DIR__等於/full/absolute/path/foodir。並且dirname(__DIR__)去往路徑上的一個目錄,所以dirname(__DIR__)/full/absolute/path,並且其中bar.php所在的是/full/absolute/path/bardir。這就是我們想要的,這就是我們所得到的。

這樣你就不用擔心包含路徑相關性。它將工作任何情況下,無論身在何處foodir/foo.php

0

包括「當你使用include它承擔的基本目錄尋找 文件是當前文件的目錄」

所以,當你必須包括文件從另一個目錄,你必須從指定的父目錄的相對路徑如下"Base"包括所以我們說對

Base -> A 
     ->file1.php 
     ->B 
     ->file1.php 

之後我們將l使用

include "../A/file1.php"; 

用於從A添加文件,反之亦然。

假設../爲指定目錄

你也可以在常量使用__DIR__樣訂做用於獲取當前文件的目錄名的上一級