簡體   English   中英

PHP包含路徑問題:“ ./”未鏈接到我期望的位置?

[英]PHP include path issues: “./” doesn't link where I expect it?

我正在從頭開始開發php MVC框架,並且遇到了一個與默認WAMP部署的相對路徑有關的有趣問題...當我開始編寫框架中的包含和要求時出現了問題...

我的框架入口點位於文檔根目錄深處的一個文件夾中:

http://localhost/platform/index.php <-框架入口點; 物理路徑為c:/ wamp / www / platform /

當我從框架中的任何文件運行以下目錄遍歷代碼時...

$handle = opendir('./');
while ($file = readdir($handle))
{    
    echo $file."<br/>";   
}

...我得到相同的結果:

.
..
ABOUT_APACHE.txt
bin
cgi-bin
CHANGES.txt
conf
error
htdocs
icons
include
INSTALL.txt
lib
LICENSE.txt
logs
manual
modules
NOTICE.txt
OPENSSL-NEWS.txt
OPENSSL-README.txt
README-win32.txt
README.txt
wampserver.conf

那是位於c:/wamp/bin/Apache2.2.17/的文件夾的內容

轉儲ini_get('include_path')“。; c:/ php / pear” ...這很好奇,因為它是默認的WAMP安裝,將php放在c:/wamp/bin/php/php5.3.4/,並且據我所知,不要將梨放在任何地方(我在php5.3.4文件夾中看不到它!)...

第一個問題 :為什么Webroot中的任何特定文件中的“ ./”都不是指該文件所在的目錄? 第一個問題,第二部分:為什么無論調用文件的位置如何,它總是引用wamp部署的apache文件夾的根目錄?

將文件夾的內容轉儲到“ /”處會顯示:

$INPLACE.~TR
$RECYCLE.BIN
$WINDOWS.~Q
boot
bootmgr
BOOTSECT.BAK
cert.pfx
Config.Msi
Documents and Settings
DVDPATH.TXT
hiberfil.sys
HP
msdia80.dll
MSOCache
pagefile.sys
PerfLogs
Program Files
Program Files (x86)
ProgramData
Recovery
SWSetup
System Volume Information
System.sav
updatedatfix.log
Users
wamp
Windows

第二個問題 -為什么從腳本中打開路徑“ /”時引用的是C:\\而不是文檔根目錄(即C:\\ wamp \\ www)

最后一個問題 -如何配置PHP以確保在這些情況下(/ =>文檔根目錄,。/ =>引用腳本的文件夾),我所期望的是實際的路徑?

我完全錯了嗎? 有一次,我認為相對路徑是在引用CALLED腳本或入口點的文件夾的情況下,在這種情況下是c:/ wamp / www / platform / ...不管引用哪個文件,而是php。凈文件似乎說不。 PHP.net表示,使用相對路徑(帶有前置句號)執行功能的FILE所在的文件夾均應為該相對路徑的起始位置。 我的配置似乎都不是這種情況...

謝謝你的時間!

第一個問題:相對包含路徑是相對於當前工作目錄進行解釋的; 通過apache + mod_php運行時,通常是直接從apache調用的頂級腳本的位置。 這是一個不幸的設計決策,由於PHP的普及,無法撤消。

第二個問題: PHP最初是為類Unix系統編寫的,其中/表示絕對文件系統根。 Windows沒有這樣的東西,因此,PHP使用了第二個最好的東西,即主體文件系統上的頂級目錄,通常是C:\\

第三個問題:這里有兩個解決方案。 第一個解決方案:在自動前綴腳本中設置適當的include_path ,並且僅使用相對名稱,例如,當您擁有C:\\www\\myproject\\foo\\bar.php ,將C:\\www\\myproject\\foo到include_path ,只需include 'foo.php' 解決方法二:使用的組合dirname()函數和__FILE__超全局,使您明確地包括相對於當前的文件,例如,當你想包括C:\\www\\myproject\\foo\\bar.phpC:\\www\\myproject\\baz.php ,使用諸如include dirname(__FILE__) . '/foo/bar.php' include dirname(__FILE__) . '/foo/bar.php' 在實踐中,您可能會同時使用這兩種方法,即在自動准備腳本中使用dirname(__FILE__)技巧來設置相對於自動准備腳本本身的包含路徑。

如果使用PHP的OOP功能,則還需要設置一個類自動裝入器,這樣就不必顯式地包括所有使用的類的定義。

哦,您可能想閱讀該文檔: http : //www.php.net/manual/zh/function.include.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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