2009-12-02 145 views
2

我在我的項目的根目錄中有一個配置文件,其中包含一個特定於環境的常量類。我遇到的問題是如何將當前目錄設置爲ROOT var。大意如下:PHP將當前目錄設置爲類常量

Class Config { 
    const ROOT = dirname(__FILE__); 
} 

這是不可能的,因爲它是一個常量表達式。我也試圖改變它在每個實例的交易,如:

Class Config { 
    const ROOT = '/old/path'; 
    public function __construct(){ $this->ROOT = '/new/path'; echo $this->ROOT; } 
} 
$config = new Config; 

這似乎是工作,但這需要經過我身邊所有的類之間$配置。有沒有人發現這個黑客?

(另外,我不在php5.3上,所以__DIR__將無法​​正常工作)。

回答

4

製作它是在第一次呼叫時初始化的靜態功能:

class Conf { 

static protected $_root= null; 

static public function root() { 
    if (is_null(self::$_root)) self::$_root= dirname(__FILE__); 
    return self::$_root; 
} 

} 

這允許y ou在類中設置root並保護root覆蓋的值。

+1

儘管我採用了完全不同的解決方案,但我喜歡它。 – 2009-12-02 20:17:30

1

你可以使用一個static屬性,而不是像這樣的常數:

Class Config { 
    public static $ROOT = ''; // Can't call dirname yet 
} 
Config::$ROOT = dirname(__FILE__); // Now we can set it 

然後你就可以在任何地方調用它(假設你的配置文件包含)是這樣的:

Config::$ROOT 
0

我正在挖掘這個問題,因爲我在另一個項目中找到了另一個解決方案。 該項目已經使用了這個常數,所以我不能將所有的呼叫都改爲Config::ROOT常數。

的解決方案是這樣:

<?php 
// classes/Config.php 
eval('class Config { const ROOT = "'.dirname(__FILE__).'"; }'); 

這是非常醜陋,但它的工作對這種情況。

相關問題