2009-12-02 148 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__).'"; }'); 

这是非常丑陋,但它的工作对这种情况。

相关问题