要求功能无法在功能外访问

时间:2012-10-01 10:26:55

标签: php configuration configuration-files

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

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

加载文件的功能是:

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

我也曾尝试在课堂上这样做,但也遇到了同样的问题

class configManager {
    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);

任何人对如何实现这一点都有任何想法?

2 个答案:

答案 0 :(得分:1)

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

示例:

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

global.cfg.php:

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

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

BUT!尽量不要制作全局变量。考虑另一种解决方案。例如,只配置基于环境的参数,而不是整个对象的创建。如果您在其他地方执行此操作,则可以避免globals并使代码更易读和简单。

答案 1 :(得分:0)

变量的范围是定义它的上下文。在大多数情况下,所有PHP变量只有一个范围。此单一范围也涵盖包含和所需文件。