2010-03-22 108 views
1

我们使用实例化并将系统关键对象放在$GLOBALS中,以便从任何地方(例如数据库,缓存,用户等)轻松访问。将变量推入全局范围?

我们使用$GLOBALS这么多,如果我可以像$G = &$GLOBALS那样为速记调用引用它,那么它肯定会降低代码量。

问题是,根据我的经验和几个小时的谷歌搜索,我还没有发现PHP中的任何构造,它允许您将var标记为全局变量,使$GLOBALS变为第一类,其他所有变成第二类。

我错过了什么吗?这可能吗?

回答

1
global $variable; //? 
+1

这只会在建立的范围内打开一个洞,它不会主动地突破子范围。 – Spot 2010-03-22 09:36:18

2

而不是把一切都变成$GLOBALS的你可能想看看进入registry concept是在PHP世界普遍。

但是,具有许多全局变量/对象是设计不佳和高耦合的标志。使用类似$G的东西保证了意大利面代码和即将到来的维护噩梦。谁在乎,如果你可以减少几个字符的代码量?

+0

我们不会将所有内容放在'$ GLOBALS'中。 '$ GLOBALS'中可能有八(8)个对象。如果某个系统很关键,因为它在每个页面上都是必需的,而且经常被访问,我们把它放在'$ GLOBALS'中。 – Spot 2010-03-22 09:37:32

+0

为什么不在其他操作之前加载注册表? – Benoit 2010-03-22 10:59:32

+0

如果你失望,请让我知道为什么,我可以从我的错误中学习。 – middus 2012-06-12 07:26:32

2

没有,但你可以使用一个小窍门。通过与全局变量相同的名称创建一个全局函数,并让它返回全局实例。例如:

function db() { 
    return $GLOBALS['db']; 
} 

现在,您可以编写代码为:

... 
$stuffs = db()->query("select * from stuff"); 
... 

您可能认识到这是一个变体在单件模式,但语法更加愉快。

其他人已经提到过它,但你也应该考虑而不是首先使用全局对象。我通常更喜欢将对象传递到需要的地方(依赖注入)。尽管我没有过多地发现注册表模式。

+0

全球功能理念很有趣。它确实增加了对大多数系统调用的另一个函数调用,但这可能是值得的。 为了清楚起见,我们在GLOBALS中的字面意思是有8个对象,并且它们是被_constantly使用的实例化对象。我们的系统是完全独立的。我们根本不使用任何第三方代码。在五年以后,我们实际上没有任何问题。我理解对全球数据的担忧,但这并不适用于此。 我们对全球数据非常谨慎。我们甚至把我们所有的控制器都关闭了,以保证安全。 :) 感谢您的答复 – Spot 2012-06-12 00:28:43

4
<?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