Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将当前目录设置为类常量_Php_Oop_Constants - Fatal编程技术网

PHP将当前目录设置为类常量

PHP将当前目录设置为类常量,php,oop,constants,Php,Oop,Constants,我在项目的根目录中有一个配置文件,其中包含一类特定于环境的常量。我遇到的问题是如何将当前目录设置为根变量 Class Config { const ROOT = dirname(__FILE__); } 这是不可能的,因为它是一个常量表达式。我还尝试在每个实例的交易中更改它,如: Class Config { const ROOT = '/old/path'; public function __construct(){ $this->ROOT = '/new/path';

我在项目的根目录中有一个配置文件,其中包含一类特定于环境的常量。我遇到的问题是如何将当前目录设置为根变量

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;
这似乎可行,但这需要在我的所有类之间传递$config。有人发现这附近有黑客吗


(另外,我还没有使用php5.3,所以
\uuuuu DIR\uuuu
不起作用)。

您可以使用
静态属性,而不是像这样的常量:

Class Config {
    public static $ROOT = ''; // Can't call dirname yet
}
Config::$ROOT = dirname( __FILE__ ); // Now we can set it
Config::$ROOT
然后您可以在任何地方调用它(假设包含您的配置文件),如下所示:

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

使其成为第一次调用时初始化的静态函数:

class Conf {

 static protected $_root= null;

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

}

这允许您在类中设置root,并保护root的值不被覆盖。

我正在研究这个问题,因为我在另一个项目中找到了另一个解决方案。 项目已经使用了常量,因此我无法更改对
Config::ROOT
常量的所有调用

解决办法是:

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

尽管我采用了完全不同的解决方案,但我喜欢它。