Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 函数内部需要不可访问的函数外部_Php_Configuration_Configuration Files - Fatal编程技术网

Php 函数内部需要不可访问的函数外部

Php 函数内部需要不可访问的函数外部,php,configuration,configuration-files,Php,Configuration,Configuration Files,奇怪的请求,我正在使用configuration manager函数来要求配置文件,这样我们只加载所需的变量,而不是数百个设置变量 问题是,其中一个文件有一个类和变量集,现在它们被包括在内,但是不能从主脚本访问它们 加载文件的函数是: function load($OPT){ if (file_exists(ABSPATH. "includes/config/".$OPT.".config.php")){ require_once(ABSPATH.

奇怪的请求,我正在使用configuration manager函数来要求配置文件,这样我们只加载所需的变量,而不是数百个设置变量

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

加载文件的函数是:

    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_转储输出与预期一样,但是如果您执行了如下所示的var_转储,则返回null

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

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

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

我不喜欢这种配置解决方案。然而,有一个解决办法。 正如hakra所提到的,作用域在函数内部。您可以使用
global
使变量对外可见

例如:

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

global $DB;
$DB = mysql_connect(...);
这将确保
$DB
作为全局变量处理,而不是作为局部变量处理


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

因此,除了加载配置指令外,您的函数的行为类似于自动加载程序。您在函数中加载它,但希望能够全局访问它们。您的解决方案应该很简单:使用类获取配置指令。使用自动加载程序包括扩展基本配置类的适当配置类。您所要做的就是做一些类似于
CFGClass::get('variable name')
$cfg->get('variable name')
,具体取决于您使用的方法。当然,这只是一个简单的例子。@N.B.对不起,我没有遵循这个例子。这个例子说,不要在函数中包含文件,使用类来处理配置变量。不要使用
define('variable','value')
,因为您不能在函数中定义常量和变量,并期望它们在任何地方都能工作。使用1个类,该类使用PHP的自动加载函数加载子类,并使用该类获取变量值。该类可以在任何地方访问,并且不会污染全局范围。我也讨厌全局范围,但看起来这是唯一的方法。不确定“仅配置基于环境的参数”是什么意思,配置文件有什么不同?我认为它存在于主机、用户、密码等参数中。您只能将这些参数放入cfg文件中,并在“main”代码中创建对象。示例:configMan在构造函数中加载配置
$cfgMan=new ConfigManager('local')
。然后可以将cfg值存储在对象参数中。您可以使用fce获取DB对象,它看起来像
$cfgMan->DB()
。CfgMan将根据从cfg文件接收到的参数为DB创建实例。