将变量推入全局范围?

时间:2010-03-22 09:12:04

标签: php global-variables

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

我们使用$GLOBALS以至于如果我可以像$G = &$GLOBALS那样引用速记,那么(是的,真的)会减少相当多的代码。

问题在于,根据我的经验和几个小时的谷歌搜索,我没有在PHP中找到任何构造,它允许你将var“标记”为全局,使$GLOBALS成为第一类,其他一切都是第二类类。

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

5 个答案:

答案 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?