我们使用实例化并将系统关键对象放在$GLOBALS
中,以便从任何地方轻松访问(例如DB,缓存,用户等)。
我们使用$GLOBALS
以至于如果我可以像$G = &$GLOBALS
那样引用速记,那么(是的,真的)会减少相当多的代码。
问题在于,根据我的经验和几个小时的谷歌搜索,我没有在PHP中找到任何构造,它允许你将var“标记”为全局,使$GLOBALS
成为第一类,其他一切都是第二类类。
我错过了什么吗?这可能吗?
答案 0 :(得分:5)
<?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
答案 1 :(得分:2)
不要将所有内容放入$GLOBALS
,您可能需要查看php世界中普遍存在的registry concept。
然而,拥有许多全局变量/对象是设计糟糕和高耦合的标志。使用像$G
这样的东西可以保证意大利面条代码和即将到来的维护噩梦。谁在乎你是否可以减少几个字符的代码量?
答案 2 :(得分:2)
不,但你可以用一点技巧。使用与全局var相同的名称创建全局函数,并使其返回全局实例。例如:
function db() {
return $GLOBALS['db'];
}
您现在可以将代码编写为:
...
$stuffs = db()->query("select * from stuff");
...
你可能会认为这是单身人士模式的一种变体,但在语法上更加令人愉快。
其他人已经提到过,但你也应该首先考虑 not 使用全局对象。我通常更喜欢将对象传递到需要的地方(依赖注入)。我虽然没有过多地找到注册表模式。
答案 3 :(得分:1)
global $variable; //?
答案 4 :(得分:1)
除了Middus指出的注册表概念之外,还有几种方法和概念,其中一些可以在这个问题的答案中找到:
In a PHP project, how do you organize and access your helper objects?