[英]PHP Include calling other files
我意識到我在PHP文件中一遍又一遍地使用了特定的函數,因此我從所有函數中取出了該函數,並將其放在單獨的PHP文件中,並在需要的地方包含了該函數。
現在,當我對函數進行更新時,使用該函數的所有文件都會更新。 大。
現在只有一個問題,該函數本身使用相對URL,當您包含PHP時,文件是相對於調用PHP的文件,而不是所包含的PHP目錄的文件。 我知道快速而又骯臟的答案是使用絕對鏈接,但是我如何才能使包含的PHP引用ITSELF而不是調用它的PHP。
例:
index.php包含一個名為create_table.php .....的文件。create_table.php將CSS和javascript回顯到index.php。 CSS和javascript與create_table.php位於同一目錄中,但是當使用src =“ javascript.js”時,它想查找index.php所在的javascript.js,而不是create_table.php所在的目錄。
編輯:結構如何工作
/includes/create_table.php
/includes/style.css
/includes/javascript.js
/test/dir/1/2/3/index.php
因此,當我嘗試使用src =“ javascript.js”而不是查找/includes/javascript.js時,它將嘗試查找/test/dir/1/2/3/javascript.js
絕對鏈接的使用不是“快速而骯臟的”,而是絕對必要的。
而且您的問題與PHP幾乎沒有共同之處。 是HTML問題。 從HTML代碼讀取鏈接后,不是PHP調用您的CSS文件,而是瀏覽器 。
絕對路徑的唯一目的是解決您的問題-從任何位置查找特定文件。
當然,它應該僅是路徑,而不是URI。 所有HTML鏈接都可以(並且應該)縮短為路徑部分。
而不是尋找/includes/javascript.js
答對了!
因此,只需告訴它尋找這個地址,一個絕對的地址-/ /includes/javascript.js
我認為您最終將必須使用絕對路徑。 問題是如何在不進行硬編碼的情況下獲取那些絕對路徑...
您可以使用魔術常數__FILE__
來獲取當前腳本的絕對路徑(即create_table.php),然后執行以下操作:
$filename = realpath(dirname(__FILE__).'/../../css/mystyles.css');
要獲取文件的絕對路徑,您知道該文件是相對於當前腳本的。 (即,向上兩個目錄,向下進入css /)
或者,您可以以其他方式開始並使用$_SERVER['DOCUMENT_ROOT']
。 假設您知道所有相對於您的webroot的路徑。 這將是我的首選方式。
編輯:我認為您幾乎可以忽略上述情況! 我假設(在進行編輯之前)您實際上是在服務器端讀取CSS和JavaScript文件,並將其內容添加到index.php-我想不是!
重新回答...正是由於這個問題,我永遠不會將相對
路徑
URL用於客戶端CSS和JavaScript。 有些人總是使用絕對URL,就我個人而言,我更喜歡相對根URL。 如果您是在服務器端生成此URL,則沒關系。
根目錄相對網址: /includes/style.css
您認為這有什么問題? 我會說這是首選。
可能有更好的方法來處理您要執行的操作,而不是動態地從PHP函數中請求文件。
至少,絕對路徑是關鍵,並且通常是從根開始絕對路徑,例如:require_once(“ / lib / fileOne.php”);
不是:require_once(“ lib / fileOne.php”);
因此,您說的是總是需要一個文件。 在此文件中,具有將__FILE__
與SCRIPT_FILENAME
進行比較的功能。 因此,例如,您知道includes/create_table.php
到根目錄的路徑是../
所以它的文件夾差為1
,如果路徑是includes/foo/create_table.php
,則到根目錄的路徑將是是../../
所以相差2
等等
$dif_to_root=1;
for
(
$i=0,$path='';
$i<($dif_to_root-(count(explode('/',__FILE__))-count(explode('/',getenv('SCRIPT_FILENAME')))));
$i++
)$path.='../';
現在,在您的代碼中輸入src="$path.includes/style.css"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.