关于php:将变量推入全局范围?

Push a variable into global scope?

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

我们经常使用$GLOBALS,如果我能像$G = &$GLOBALS那样引用它进行速记调用,它(是的,真的)会大大减少代码量。

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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
3
function db() {
  return $GLOBALS['db'];
}

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

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

您可能会认识到这是单例模式的一个变体,但在语法上更令人愉快。

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


您可能不想将所有内容都放在$GLOBALS中,而是希望了解PHP世界中广泛存在的注册表概念。

然而,拥有许多全局变量/对象是设计不良和高耦合的标志。使用像$G这样的东西可以保证意大利面条代码和即将到来的维护噩梦。谁在乎你能将代码的数量减少几个字符?


除了middus指出的注册表概念外,还有一些方法和概念,您可以在这个问题的答案中找到其中的一些:

在PHP项目中,如何组织和访问助手对象?


1
global $variable; //?