我有一个文件,它定义了这样的名称。
<root>/dir1/dir2/file1.php
//directory indicator
define("DI", "../../");
//adding required files
require_once DI . 'lib/Config.php';
require_once DI . 'lib/Common.php';
这将正确地添加Config.php
和Common.php
。
现在,当我尝试像这个一样在Config.php
中获得DI
时
<root>/Config.php
<?php
class Config
{
public $value = DI . 'some_value';
}
我无法在那里得到那个值。
如何使DI
在Config
类中可用?
编辑
真实文件夹层次
ROOT--> somefile.php
|__ lib --> config.php
|
|___ dir1
|
|__ dir2
|
|__ file1.php
我需要在config.php中定义的类中获取根目录。也就是说,我需要包括config.php
中的somefile.php
。我知道我可以像一样简单地做到这一点
include '../somefile.php';
但问题是config.php拥有一个包含static
方法的类。所以我可以得到这样的方法。
Config::MethodInsideConfig();
现在,当我从file1.php
尝试这个时,似乎../somefile.php
正在尝试从dir1
中包含。我认为php使用file1.php
的位置来计算前面的目录。但我需要的是它应该从根目录中获取文件。
将值作为参数注入到类__construct()中,并在构造函数中设置属性
class Config
{
public $value;
public __construct($di) {
$this->value = $di . 'some_value';
}
}
$myConfig = new Config(DI);
为什么定义新常量PHP已经有预定义的常量DIR它包含当前文件目录。
所以,你的要求是这样的:
//adding required files
require_once __DIR__.'/../../'. '/lib/Config.php';
require_once __DIR__.'/../../'. 'lib/Common.php';
- 使用INI文件
您可以使用配置文件(如config.ini)
[parameteres]
path_app_root="/usr/share/apache/www/my_app";
然后,您的config as singleton类将用于解析ini文件并获取config
<?php
class Config
{
public $configs = array();
private static $instance;
private function __construct() {}
public static function getInstance()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
self::$instance->configs = parse_ini_file(__DIR__."/../config.ini");
}
return self::$instance;
}
public function getRootPath()
{
return self::$instance->configs['path_app_root'];
}
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
}
你的file1.php会像这个
<?php
//adding required files
require_once '../../lib/Config.php';
echo Config::getInstance()->getRootPath();
Anas