我有一个config.php
文件,它被包含在每个页面中。在配置文件中,我创建了一个类似于以下的数组:
$config = array();
$config['site_name'] = 'Site Name';
$config['base_path'] = '/home/docs/public_html/';
$config['libraries_path'] = $config['base_path'] . '/libraries';
//etc...
我有一个名为function.php
的文件,它几乎被包含在每个页面中。我必须使用global $config
才能访问它 - 而我希望消除这一点!
如何在代码的其他部分中访问$config
而不使用global
?
有人可以解释一下,为什么我不应该在我的示例中使用global
吗?有些人说这是一种不好的做法,还有些人说这不安全?
编辑1:
我使用它的示例:
function conversion($Exec, $Param = array(), $Log = '') {
global $config;
$cmd = $config['phppath'] . ' ' . $config['base_path'] . '/' . $Exec;
foreach ($Param as $s)
{
$cmd .= ' ' . $s;
}
}
编辑2:
像Vilx建议的那样将所有内容放在类中,可能很酷,但在这种情况下,我该如何与从数据库提取配置key
和value
的以下循环绑定呢?
我过于简化了分配$config
数组的想法,这里是一个例子:
$sql = "SELECT * from settings";
$rsc = $db->Execute($sql);
if ( $rsc ) {
while(!$rsc->EOF) {
$field = $rsc->fields['setting_options'];
$config[$field] = $rsc->fields['setting_values'];
@$rsc->MoveNext();
}
}
编辑 3:
此外,我必须从在配置中设置的函数访问其他vars
,只有几个,例如:$db
,$language
等。
如果我将它们放入类中,这真的会解决问题吗?如果我使用global
,它真正改变了什么?
编辑 4:
我阅读了PHP global in functions,其中Gordon以非常好的方式解释了为什么不应该使用global
。 我同意他所说的一切,但在我的情况下,我不使用global
重新分配变量,这将导致像他说的那样的<--WTF!!
,哈哈,同意,这很疯狂。 但是,如果我只需要通过global $db
从函数中访问数据库,在这种情况下有什么问题? 否则,如何在不使用global
的情况下完成这项工作?
编辑 5:
在同一篇 PHP global in functions文章中,deceze说:"反对全局的一个主要原因是它意味着函数依赖于另一个范围。这将很快变得混乱。"
但是我在这里谈论的是基本的“INIT”。 我基本上设置了define
,但使用vars
--从技术上讲,这是错误的。 但是,您的函数并不依赖于任何东西-但是其中一个var的名称$db
,您可以记住吗? 需要真正的全局才能使用$db
,这里有什么依赖关系,以及如何在不使用global
的情况下使用它?
P.S. 我刚想到,我们在这里面临两种不同思维之间的冲突,例如: 我的(尚未完全理解面向对象编程)和那些可能被称为OOP大师(从我的当前观点来看) - 对他们而言显而易见的事情对我来说会产生新的问题。 我认为这就是为什么这个问题一遍又一遍地被问的原因。 就我个人而言,虽然这已经更加清晰明了,但仍有需要澄清的问题。
require_once
不够用吗? - Marek Sebera$config
,就必须使用global
关键字,否则会创建一个名为$config
的局部变量。我认为这并不特别不安全,只是很多人看到 "global" 就想到 "红色警戒",而没有实际推理具体问题。 - nico