iT邦幫忙

0

請問在 PHP 中 $_SERVER['DOCUMENT_ROOT'] 和 __FILE__ 內容不同要怎麼 include ?

  • 分享至 

  • xImage

想請問我今天想要 include 資料到我的檔案中我的檔案有很多層資料夾在內,我原本想透過$SERVER['DOCUMENTROOT']+路徑的方法去載入資料但我發現當我上傳到伺服器後怎麼樣都無法載入,我去 echo 了 $SERVER['DOCUMENTROOT']__FILE__ 兩者發現他的路徑是不同的。
include就我的認知他是去找硬碟上的資料引入,我的猜想是 Aparch 的設定導致路徑不同所以無法載入,請問在有方法能在伺服器設定不動的情況下去載入資料嗎?
我目前有透過 dirname(__FILE__)+路徑這樣的方法,但我發現因為太多層資料夾了dirname(__FILE__)越包越多層感覺不是很實際。

淺水員 iT邦大師 6 級 ‧ 2022-12-07 17:34:18 檢舉
搜尋「psr-4 autoload」
現在很多東西都是這樣載入的
好的,雖然不清楚現在很多東西都是這樣載入的是指哪個XD 但我會先去查 psr-4 autoload 是甚麼! 感謝~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
wiseguy
iT邦超人 1 級 ‧ 2022-12-09 00:19:30
最佳解答

你要先了解 $_SERVER['DOCUMENT_ROOT'] 跟 __FILE__ 的不同點是什麼,再來看你需要用哪個。

$_SERVER['DOCUMENT_ROOT'] 指的是你 apache 設定中的 DocumentRoot 目錄。這對你專案中的所有 php 程式都是同樣的值。
__FILE__ 指的是『當下』正在執行,取用到這個magic常數值的 php 程式的全路徑檔名。

假設你的專案中,DocumentRoot 是位於 /var/www/html
假設有一支 index.php 位於 /var/www/html
假設有一支 a.php 位於 /var/www/html/lib
假設有一支 b.php 位於 /var/www/html/map

index.php 要引用 a.php,index.php 可以寫

include $_SERVER['DOCUMENT_ROOT'].'/lib/a.php';
//或是
include dirname(\_\_FILE\_\_).'/lib/a.php'; //這裡的 \_\_FILE\_\_ 指的是 index.php

但 a.php 又引用 b.php,a.php 可以寫

include $_SERVER['DOCUMENT_ROOT'].'/map/b.php';
//或是
include dirname(\_\_FILE\_\_).'/../map/b.php'; //這裡的 \_\_FILE\_\_ 指的是 a.php

有看出差別嗎?不管在哪支程式,$_SERVER['DOCUMENT_ROOT'] 都是一樣的。但是 __FILE__ 則是看哪支程式執行到它,就是哪支程式的位置。

0
chatgpt2022
iT邦新手 5 級 ‧ 2022-12-07 17:51:07

您可以使用 PHP 的相對路徑來 include 您的檔案。

例如,假設您要 include 一個名為 "myfile.php" 的檔案,並且它位於當前檔案的同一個資料夾中,您可以這樣寫:
include "myfile.php";

如果要 include 位於當前資料夾的子資料夾中的檔案,則可以這樣寫:
include "subfolder/myfile.php";

如果您要 include 位於當前資料夾的父資料夾中的檔案,則可以這樣寫:
include "../myfile.php";

這樣您就可以使用相對路徑來 include 檔案,而不用擔心伺服器設定導致的路徑問題。

這個我知道,沒講清楚的是因為我目前的資料夾層數很多有會要共用一份檔案的問題,在 include 的時候會因為相對位置的關係導致路徑跑掉所以才想說有沒有直接從根路徑出發的寫法! 感謝你的回答~

0

一般來說,現在會比較不建議採用相對路徑的做法。
比較容易出事。

早期常用的做法是在其網頁根目錄上。可能寫在index或是在config上
利用常數先宣告好對應的主路徑

define('ROOT', dirname(__FILE__));

這樣在之後的程式碼下include就可以

include ROOT.'/subdir/function.php';

而在現今物件導向的情況下。已經改採用「命名空間」及「USE」來處理了。
而對應的物件載入全交給 autoload 運做處理。

這剛好就是一個早期的專案,每一個頁面都是一個 index.php,所以都是用相對路徑的寫法去操作。自己實作到一半也發現都用相對路徑會有很多的問題,加上檔案一多很多層要修改就是非常痛苦的事情。

我目前有嘗試過先宣告主路徑的方式去處理,但我有遇到其他的狀況,我嘗試說明,我的 navi.php 引入了 config.php 這個有使用常數設定主路徑的檔案時,其他不同層級的資料夾引入了 navi.php 後會因為層級關係導致 config.php 的引入路徑跑掉,所以我後來直接寫在 navi.php 但這樣還是不改我得一一修正每層資料夾的 index.php 的include 路徑,哈哈。

目前有請人去了解$SERVER['DOCUMENTROOT']所發生的狀況了應該是有些地方設定有問題(?。

期於提到的命名空間、USE,我目前只有在 laravel 使用過但不知其實作原理,看來還有很多東西得學,感謝您的回答!

我要發表回答

立即登入回答