2009年8月27日 星期四

PHP include file 時使用dirname取得絕對路徑

今天想寫網站時候育到的一個問題
我include的file找不到檔案,但是我檢查了語法並無問題
我架構大改長下面這樣

MyProject
-index.php
-core
|
-config.php
-Model
|
-DBHelper.php

MyProject資料夾底下有一個檔案(index.php)跟兩個資料夾(core,Model)
我index.php去include config.php

require_once 'core/config.php';

而 config.php又去include DBHelper.php

require_once '../Model/DBHelper.php';


奇怪的是他竟然跟我說找不到DBHelper.php,看了一下路徑設置並沒有錯
後來找了一下資料require_once參考的路徑是"現在程式"所在路徑
所以我以為config.php會很自然往上一層到MyProject資料夾在到Model找DBHelper.php
但是由於我現在程式是MyProject資料夾之下的index.php,所以他變成先到MyProject的上一層資料夾在去Model資料夾找

但是這樣很麻煩阿,我很多程式都會include config.php藉著他去include DBHelper.php
有沒有辦法在不同資料夾下尋找呢?
後來想到了用程式去叫出config.php的絕對路徑,在以此路徑去尋找相對位置

之前有提過__FILE__可以幫我們找出檔案的絕對位置,他不會受include影響
儘管是index.php去include config.php,只要__FILE__是寫在config.php
他抓出來的就是config.php的絕對路徑
因此我將程式碼修改如下

define("CONFIG_DIR",dirname(__FILE__));//抓出config.php的絕對path dir
require_once CONFIG_DIR.'../Model/DBHelper.php';//就像是/www/MyProject/core/../Model/DBHelper.php

如此一來,就能解決include時路徑不同的問題

沒有留言: