[英]PHP include(): Use case for include from original script's PWD
當使用PHP的include()
和require()
函數來包含一個文件,而該文件又包含另一個文件時,第二個文件的include()
的PWD(相對引用include()
是原始腳本位置的目錄(棧中的第一個腳本)由Apache調用,不適用於當前文件。 背后的設計決策是什么,用例是什么?
例如,假設在~/public_html/classes/database.php
定義了一個通用數據庫連接類,它將配置數據(用戶名,密碼)存儲在~/config.php
中的Web根目錄之外。 數據庫配置類的作者將在邏輯上使用相對文件名../../config.php
調用配置文件。 但是,這不能按預期工作,因為PWD不是database.php
文件,而是包含它的文件,可能是~/public_html/index.php
, ~/public_html/someDir/somePage.php
或其他地方。
我知道通過使用dirname(__FILE__)
獲取當前文件的目錄來解決這個問題。 但是,我想不出一個用例,我希望require()
或include()
相對於原始腳本位置。 它的用例是什么?
函數include()
和require()
處理相對路徑與fopen()
, unlink()
和mkdir()
等任何其他文件訪問函數相同。
無論腳本的位置如何,路徑始終與PWD相關。
考慮以下示例:
/home/foo/index.php
require_once('lib/maketest.php');
/home/foo/lib/maketest.php
mkdir('test');
這將創建目錄/ home / foo / test而不是 / home / foo / lib / test 。
我可以想象這已經選擇了,因為執行mkdir test
的bash腳本也會創建目錄$PWD/test
無論腳本位於何處。
讓include()
遵循與其他文件訪問函數相同的邏輯是有意義的。 請考慮以下代碼:
if (file_exists('config.php')) include('config.php');
如果include()
路徑相對於__DIR__
,而file_exists()
路徑相對於PWD,則上述代碼將無法按預期工作。
PWD是打印工作目錄的縮寫。 當前工作目錄縮寫為CWD。
CWD可能在代碼執行期間發生變化,PHP不一定要包含本地文件路徑中的代碼。
如您所知,將__FILE__
與dirname()
一起檢查是您問題的正確解決方案。 您還應該使用應用程序的根路徑定義常量,並在整個代碼中使用該常量,而不是依賴於工作目錄保持不變。
在所有情況下,CWD甚至都不是腳本起點的路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.