2014-06-26 64 views
0

方案PHP路徑

我有2個文件:file.phpadmin/file.php

file.php已經require_once 'admin/functions.php';

admin/file.php已經require_once 'functions.php';

所以他們倆都包括相同文件。問題在於在functions.php之內,諸如file_get_contentsincluderequire之類的東西看到相對於file.phpadmin/file.php而不是functions.php定義的路徑。因爲這個原因,我不能使用不同目錄中的相同functions.php而不創建重複的文件,我不認爲這是最好的做法,因爲我編輯一個文件,我必須記住編輯其他也是如此。

這種情況的最佳做法是什麼?

編輯:請參閱下面接受的答案的評論。

回答

1

這種情況的最佳做法是什麼?

簡單。只需在配置文件&中手動設置一個基本路徑,不用擔心它 - 相對路徑 - 再次。

這就是說,如果你正在試圖簡化文件加載的方式,你應該明確地設置一個$BASE_PATH這樣的:

$BASE_PATH = '/full/path/to/your/codebase/here/'; 

如果你不知道你的文件系統的基本路徑是什麼,只需將這行代碼放入您的PHP代碼中;像index.php

echo "Your path is: " . realpath(dirname(__FILE__)) . "<br />"; 

然後加載該頁面。附近的某處頂部將是這樣的文字:

你的路徑是:/全/路徑/到/你/用那一套代碼庫/位置/

然後你就可以改變你的代碼是什麼像這樣:

然後設置你的include_once這樣的:

include_once $BASE_PATH . 'includes/myfile.php'; 

也許有人會說,你應該使用$_SERVER['DOCUMENT_ROOT']甚至dirname(__FILE__)直接意味着你可以通過這種方式簡化代碼可移植性。但文件路徑設置爲安裝的方式可能會有所不同,所以它只是從來沒有效果好&你在一個奇怪的服務器怪癖上掛鉤的機會很高。

它總是最好還是手動設置$BASE_PATH在配置文件中,當你不是處理造成PHP常量像$_SERVER沒有被安裝,設置&配置之間是一致的頭痛移動代碼。

+1

這正是我正在尋找。一旦我認識到它是我見過的幾乎所有CSM中使用的相同練習,它就會爲我點擊。我創建了2個配置文件(一個用於管理目錄,一個用於基本目錄): Admin config.php:'define(ADMIN_PATH,realpath(dirname(__ FILE__))。'/');' Base config.php:'define(ADMIN_PATH,realpath(dirname(__ FILE__))。'/ admin /');' 我希望能夠澄清某人的解決方案。 –

+0

@SolidI使用'realpath(dirname(__ FILE __))'這個問題真的很麻煩,因爲'__FILE__'總是將符號鏈接解析爲真正的絕對路徑路徑。今天你可能不會遇到這個問題,但如果這個問題窒息,那將是原因。考慮手動編寫完整路徑。 http://www.php.net//manual/en/language.constants.predefined.php – JakeGould

0

如果您使用常量,如__DIR____FILE__那麼它可以使事情變得更容易。

的functions.php:

require __DIR__ . '/../foo.php'; // will be one directory lower than admin' 'require __DIR__ . '/bar.php'; // will be in admin directory

-1

我特別總是創建一個包含我的系統路徑和URL模式目錄中的文件。從我開始開發我的系統的那一刻開始,任何包含或要求我去做,我把這個完整的路徑。在你的情況下,這是目前最好的做法。

一個細節,require_once不會再次調用該文件。它會檢查該文件是否已被調用,然後忽略該調用。

-1

有沒有簡單的方法,而不必修改你的兩個function.php文件使用絕對路徑,而不是將它們作爲相對路徑。即使你可以通過聰明的技巧使當前的代碼工作,它會使你的生活在未來更加困難。

我將在文件頂部聲明一個變量,堅持一個路徑到它,然後再用變量在整個函數

$my_root=$_SERVER['DOCUMENT_ROOT']; 

$my_root="/usr/docs/etc/etc"; //if you don't trust the server. 

,然後就搜索文件中的路徑並更改它們

用於功能admin文件夾外的文件 從

更改爲
require "folder1/folder2"; 

require $my_root . "/folder1/folder2"; 

和功能在管理文件夾中的文件

require "folder1/folder2"; 

require $my_root . "/admin/folder1/folder2"; 

對於任何動態數據遵循相同的邏輯。

這可能是一項繁瑣的工作,但最終會減少卷積,最終可能會在以後感謝您。即使你可以使當前的代碼工作通過