【问题标题】:require within function not accessible outside function要求在函数内部不可访问外部函数
【发布时间】:2012-10-01 10:26:54
【问题描述】:

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

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

加载文件的函数是:

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

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

【问题讨论】:

  • 所以你有一个像自动加载器一样的函数,除了它加载配置指令。您在函数中加载它,但您希望能够全局访问它们。你的解决方案应该很简单:使用一个类来获取配置指令。使用自动加载器来包含扩展基本配置类的适当配置类。而你所要做的就是做一些类似CFGClass::get('variable name');$cfg->get('variable name') 的事情,这取决于你使用的方法。当然,这只是一个简单的示例。
  • @N.B.对不起,我没有按照示例进行操作
  • 该示例说不要将文件包含到函数中,使用类来处理配置变量。不要使用define('variable', 'value'),因为您不能在函数中定义常量和变量并期望它们在任何地方都可以工作。使用 1 个使用 PHP 的自动加载函数加载子类的类,并使用该类获取变量值。该类可以在任何地方访问,并且不会污染全局范围。

标签: php configuration configuration-files


【解决方案1】:

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

例子:

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

global.cfg.php:

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

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

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

【讨论】:

  • 我也讨厌全局变量,但它看起来是唯一的方法。不确定“仅配置基于环境的参数”是什么意思
  • 配置文件有何不同?我认为它在主机、用户、密码等参数中。您只能将它们放入 cfg 文件并在“主”代码中创建对象。示例:configMan 在构造函数$cfgMan = new ConfigManager('local') 中加载配置。然后,您可以将 cfg 值存储在对象参数中。你可以使用 fce 来获取 DB 对象,它看起来像 $cfgMan->db()。 CfgMan 将根据从 cfg 文件接收到的参数为数据库创建实例。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 2017-03-08
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多