将变量推入全局范围?
我们使用实例化并将系统关键对象放在$GLOBALS
中,以便从任何地方(例如数据库,缓存,用户等)轻松访问。将变量推入全局范围?
我们使用$GLOBALS
这么多,如果我可以像$G = &$GLOBALS
那样为速记调用引用它,那么它肯定会降低代码量。
问题是,根据我的经验和几个小时的谷歌搜索,我还没有发现PHP中的任何构造,它允许您将var标记为全局变量,使$GLOBALS
变为第一类,其他所有变成第二类。
我错过了什么吗?这可能吗?
global $variable; //?
而不是把一切都变成$GLOBALS
的你可能想看看进入registry concept是在PHP世界普遍。
但是,具有许多全局变量/对象是设计不佳和高耦合的标志。使用类似$G
的东西保证了意大利面代码和即将到来的维护噩梦。谁在乎,如果你可以减少几个字符的代码量?
除了注册表概念Middus指出,有几种方法和概念解决这个问题,其中一些可以在答案找到了这个问题:
In a PHP project, how do you organize and access your helper objects?
没有,但你可以使用一个小窍门。通过与全局变量相同的名称创建一个全局函数,并让它返回全局实例。例如:
function db() {
return $GLOBALS['db'];
}
现在,您可以编写代码为:
...
$stuffs = db()->query("select * from stuff");
...
您可能认识到这是一个变体在单件模式,但语法更加愉快。
其他人已经提到过它,但你也应该考虑而不是首先使用全局对象。我通常更喜欢将对象传递到需要的地方(依赖注入)。尽管我没有过多地发现注册表模式。
全球功能理念很有趣。它确实增加了对大多数系统调用的另一个函数调用,但这可能是值得的。 为了清楚起见,我们在GLOBALS中的字面意思是有8个对象,并且它们是被_constantly使用的实例化对象。我们的系统是完全独立的。我们根本不使用任何第三方代码。在五年以后,我们实际上没有任何问题。我理解对全球数据的担忧,但这并不适用于此。 我们对全球数据非常谨慎。我们甚至把我们所有的控制器都关闭了,以保证安全。 :) 感谢您的答复 – Spot 2012-06-12 00:28:43
<?php
function &G($name) {
if(func_num_args() > 1) {
$GLOBALS[$name] = func_get_arg(1);
}
return $GLOBALS[$name];
}
G('test', 'hey');
echo G('test'); // outputs hey
echo $test; // outputs hey
$b =& G('test');
$b = 'hello';
echo G('test'); // outputs hello
echo $test; // outputs hello
这只会在建立的范围内打开一个洞,它不会主动地突破子范围。 – Spot 2010-03-22 09:36:18