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

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

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

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

4

2 回答 2

1

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

例子:

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

全局.cfg.php:

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

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

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

于 2012-10-01T11:55:21.490 回答
0

变量的范围是定义它的上下文。大多数情况下,所有 PHP 变量都只有一个作用域。这个单一范围也涵盖了包含和必需的文件。

于 2012-10-01T10:28:16.537 回答