我在php中完成了一个应用程序,并且所有配置变量都在脚本开头的大$ conf变量中加载。
将此配置变量传递给所有其他函数的更好方法是什么?
使它成为每个功能的参数?或者使用“global $ conf;”每个职能部门的陈述?
有更好的方法吗?
由于
答案 0 :(得分:4)
为了小马,请不惜一切代价避免使用全局变量:)
修改强>
关于“不惜一切代价避免全球变量”的一些解释和可能的替代方案:
答案 1 :(得分:2)
创建一个存储选项的配置类。使它成为单身PHP Manual describes that here。这只是全局变量的替代方案。它允许您定义一个方法来从文件或php数组加载选项并将它们存储在类中。其他类可以通过获取单个实例并访问数据来使用配置对象。
我认为这比全局变量更好,因为另一个答案也说。但它仍然允许您将选项定义为数组,甚至可以根据需要定义嵌套数组(并相应地设置您的类)
答案 2 :(得分:0)
您使用单个全局范围的变量$conf
完全没问题。许多PHP应用程序都这样做。但是战斗有一些缺点。
特别是在要访问它们的每个函数中编写global $conf
通常会更加努力。在这种情况下,我建议使用简单的全局包装函数:
function conf($key, $sub="") {
global $conf;
if (defined($key))
{ return constant($key); }
elseif ($sub)
{ return $conf[$key][$sub]; }
else
{ return $conf[$key]; }
}
这使您可以在需要时编写conf("setting1")
或conf("main", "opt3")
。您仍然可以访问更适合的全局$conf
。作为额外奖励,您可以通过允许查询替代设置等使此包装函数更加智能化。还可以看到在conf("CONSTANT")
支持中潜行是多么容易。
保持这一点可以在定义配置设置时增加一些灵活性。我个人使用类似的方法,虽然步骤而不是一次定义数组:
$app_config["title"] = ...;
$app_config["editor.btns"] = ...;
define("RESTRICTED_MODE", true);
我更喜欢使用array()方法,但过渡到ini文件以便稍后存储不是问题。此外,如果需要,您仍然可以将配置数组设置为只读。为此,只需定义:
class Read_Only_Array extends ArrayObject { function offsetSet() {} }
$conf = new ReadOnlyArray($conf);
所以它仍然可以作为数组访问,但你很容易确定其他人使用繁琐的注册表或语法解决方法。
“全球化是邪恶的”模因完全是胡扯。货运崇拜程序员希望过度简化,并且在不理解语言语义的情况下浏览大胆的新闻标题的新人会对SO进行抨击。
在您的情况下,您只需使用一个$ conf变量,并且不会污染共享范围。当从整个应用程序中连贯地访问它时,那不是问题。但是,您应该严格避免在运行时修改内容(如果需要,请使用Read_Only_Array)。为此创建辅助$app_var[]
aray,并使配置设置保持静态。