簡體   English   中英

PHP include():用例來自原始腳本的PWD

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM