今天遇到一個問題:php,incldue_once引入多次文件,多層引用,所以,不同目錄下的文件要使用一個文件得先確定目錄,比如(下例是提取出來的精簡例子,組織的有點亂亂的):
/homepage/index.php文件include引入了/homepage/temp1/index.php
首頁文件(/homepage/temp1/index.php)以及 列表文件(/homepage/temp1/news_list.php)
都引入了一個top.php文件,里面需要訪問homepage下的a.png文件,現在需要不通過絕對路徑,通過相對路徑訪問,但是
首頁文件(/homepage/temp1/index.php)是通過/homepage/index.php訪問的,$_SERVER["PHP_SELF"] 輸出:/blog/Homepage/index.php
列表文件(/homepage/temp1/news_list.php)是通過/homepage/temp1/news_list.php訪問的,$_SERVER["PHP_SELF"] 輸出:/blog/Homepage/temp1/news_list.php
現在如果有變量可以直接鎖定到固定的目錄下就Ok了,
function chdirdir(){//鎖定homepage $dir=dirname($_SERVER["PHP_SELF"]); while(strpos($dir,'temp')!==false){ $dir=dirname($dir); } return $dir; }
判斷路徑中有沒有temp字符串,有就去掉/后取上級...
現在在首頁和列表都可以如此調用:
$dirx=chdirdir(); echo "<img src=$dirx/a.png>";
雖然dirname()介紹為:本函數返回去掉文件名后的目錄名。但是發現它可以每次取/后面字符以達到取到目錄效果,這里用了這個小bug或者feature。
p.s.還是用框架好,這次這個領導又一意孤行的要逼死誰要用原生的。TP用習慣了這次在原生里還寫了類似的U方法,不過比TP的弱多了,其實有點像ajax執行方式。
本來想用chdir(),可能不會用,最后也沒用上。
通過 php應用路徑變量問題總結 整理了一個輸出路徑的函數,
function paths(){ $pathsarr=array( '當前請求的 Host:'=>$_SERVER["HTTP_HOST"], '請求執行文件的相對地址:'=>$_SERVER["PHP_SELF"], '實際執行文件相對地址:'=>$_SERVER["SCRIPT_NAME"], '實際執行文件的絕對路徑:'=>$_SERVER["SCRIPT_FILENAME"], '實際執行代碼的絕對路徑:'=>__FILE__, 'url請求中包括/和之后的所有內容:'=>$_SERVER["REQUEST_URI"], 'url請求中?之后的內容:'=>$_SERVER["QUERY_STRING"], '文檔根目錄:'=>$_SERVER["DOCUMENT_ROOT"], '請求執行文件的的文件名:'=>basename($_SERVER["PHP_SELF"]), '實際執行文件的文件名:'=>basename($_SERVER["SCRIPT_NAME"]), '實際執行文件的文件名:'=>basename($_SERVER["SCRIPT_FILENAME"]), '實際執行代碼的文件名:'=>basename(__FILE__), '請求執行文件的的所在目錄:'=>dirname($_SERVER["PHP_SELF"]), '實際執行文件的所在目錄:'=>dirname($_SERVER["SCRIPT_NAME"]), '實際執行文件的所在目錄:'=>dirname($_SERVER["SCRIPT_FILENAME"]), '實際執行代碼的所在目錄:'=>dirname(__FILE__), 'dir:'=>__DIR__ //dirname(__FILE__)和__DIR__一樣一樣的 ); var_dump($pathsarr); }