2012-10-01 189 views
0

奇怪的请求,我使用配置管理器功能要求配置文件,以便我们只加载所需的变量,而不是数百的设置。要求功能不可访问功能外

问题是,其中一个文件有一个类和变量集,现在它们包含在内,但不能从主脚本访问它们。

的函数加载该文件是:

function load($OPT){ 
     if (file_exists(ABSPATH. "includes/config/".$OPT.".config.php")){ 
      require_once(ABSPATH. "includes/config/".$OPT.".config.php"); 
     } else { 
      echo "Missing configuration script ".$OPT.", application has been halted."; 
      exit(); 
     } 
    } 

我也试图通过同一问题

​​

的文件,它包括将有这样的代码做到这一点的一类,但凸轮下面

define('COMPANYNAME', 'NAME'); 
define("IPADDRESS", $_SERVER['REMOTE_ADDR']); // IP Address of accessing user 
require_once (ABSPATH . 'includes/classes/mysql.class.php'); // class to manage the database 
$DB = new sqlClass; 
var_dump($DB); 

现在的var_dump在按预期上面的代码输出,但是如果哟你做了如下所示的var_dump,它返回null!

require_once (ABSPATH . 'includes/functions/_configmanager.php'); // Class to manage the configuration of the site. 
loadconfig("global"); 
var_dump($DB); 

任何人有任何想法如何实现这一目标?

+0

所以你有一个函数,像一个自动加载器,除了加载配置指令。你在一个函数中加载它,但你希望能够在全局访问它们。你的解决方案应该很简单:使用一个类来获取配置指令。使用自动加载器来包含扩展基本配置类的相应配置类。你所要做的就是像'CFGClass :: get('variable name');'或'$ cfg-> get('variable name')'这样的操作,这取决于你使用的方法。这当然只是一个简单的例子。 –

+0

@ N.B。对不起,我没有按照示例 – Neo

+0

该示例说明不要将文件包含到函数中,请使用类来处理配置变量。不要使用'define('variable','value')'因为你不能在函数中定义常量和变量,并期望它们在任何地方都能工作。使用1类使用PHP的自动加载函数加载子类,并使用该类来获取变量值。该课程可以在任何地方访问,而且不会污染全球范围。 –

回答

0

变量的范围是其定义的上下文。大多数情况下,所有PHP变量只有一个范围。这个单一的范围跨越了包含和必需的文件。

1

我不喜欢这种配置方案。但是,有一个解决方案。 如前所述,范围在函数内部。您可以使用global使变量对外可见。

例子:

global $DB; 
require_once('configManager.php'); 
loadcfg('global'); 

global.cfg.php:

global $DB; 
$DB = mysql_connect(...); 

这将确保,即$DB作为全局变量,而不是本地处理。

但是!尽量不要使全局变量。想想另一种解决方案。例如,仅配置基于环境的参数,而不是整个对象的创建。如果你在其他地方这样做,你可以避免globals,并使你的代码更具可读性和简单性。

+0

我也很讨厌全局变量,但它看起来像是它唯一的方法。不确定你的意思是“仅配置基于环境的参数” – Neo

+1

配置文件有何不同?我认为它的参数是主机,用户,密码等。你可以只将它们放入cfg文件中,并在'main'代码中创建对象。例如:configMan在构造函数'$ cfgMan = new ConfigManager('local')'中加载配置。然后,您可以将cfg值存储在对象参数中。比你可以获得DB对象的fce,它看起来像'$ cfgMan-> db()'。 CfgMan将根据从cfg文件接收到的参数为DB创建实例。 – macino