如何使全局定义的名称可用?

时间:2014-10-15 14:17:22

标签: php class global-variables global

我有一个定义这样名字的文件。

<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.phpCommon.php

现在,当我尝试DI Config.php这样的<{1}}

<root>/Config.php

<?php
class Config
{
   public $value = DI . 'some_value';
}

我无法在那里得到那个价值。

如何在DI课程中提供Config

修改

Real Folder Hierarchy

ROOT--> somefile.php
|__ lib --> config.php
|
|___ dir1
     |
     |__  dir2  
          |
          |__ file1.php

我需要在config.php中定义的类中获取根目录。我需要在somefile.php中添加config.php。我知道我可以像

那样做
 include '../somefile.php';

但问题是config.php包含一个包含static方法的类。所以我可以得到这样的方法。

  Config::MethodInsideConfig();

现在,当我从file1.php尝试此操作时,似乎../somefile.php正在尝试从dir1添加。我认为php使用file1.php的位置来计算前面的目录。但我需要的是它应该从根目录中获取文件。

2 个答案:

答案 0 :(得分:0)

将值作为参数注入类__construct(),并在构造函数中设置属性

class Config
{
    public $value;

    public __construct($di) {
        $this->value = $di . 'some_value';
    }
}

$myConfig = new Config(DI);

答案 1 :(得分:0)

为什么定义新常量PHP已经预定义了constante 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";

然后,您的配置为singleton类将用于解析ini文件并获取配置

<?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();