访问PHP全局变量的方法

时间:2010-05-25 01:56:19

标签: php syntax

$GLOBALS['current_view']global $current_view,您更喜欢哪个?为什么?

4 个答案:

答案 0 :(得分:10)

两者都没有,将参数传递给方法。每当你使用全球化时,上帝都会杀死一只小猫。

答案 1 :(得分:3)

如果我必须使用全局变量,并且像瘟疫那样避免它们,我使用全局$ current_view。我只是喜欢总是有一个本地范围的变量而不是依赖于超级全局变量。但我认为这是一个偏好问题。

答案 2 :(得分:3)

就个人而言,我更喜欢$GLOBALS['glob']语法,因为我可以复制粘贴代码,而不必担心将变量声明为全局变量。请记住,您应该尽量保持全局变量(可能只是全局配置指令,甚至是......)。

然而,这两种方法并不完全是同义词;有一点点差异:

function func() {
    var_dump($GLOBALS['glob']);
}

function func2() {
    global $glob;
    var_dump($glob);
}

如果全局'glob'不存在,第一个将发出通知。第二个不会。

在第一种情况下,将$GLOBALS['glob']作为参数发送编译为:

     3      FETCH_R                      global              $0      'GLOBALS'
     4      FETCH_DIM_R                                      $1      $0, 'glob'

您在读取上下文中提取GLOBALS及其索引glob;没有创建变量。

第二个编译为

     compiled vars:  !0 = $glob
     ...
     2      FETCH_W                      global lock         $0      'glob'
     3      ASSIGN_REF                                               !0, $0

您正在创建对全局glob的引用,因此如果它不存在则会隐式创建。

此外:

function func_unset() {
    unset($GLOBALS['glob']);
}

function func2_unset() {
    global $glob;
    unset($glob);
}

函数func()实际上将取消设置全局,func2_unset只会破坏创建的引用。

请注意func2非常类似于:

function func3() {
    $glob =& $GLOBALS['glob'];
}
然而,这个可能效率较低。它编译为

     2      FETCH_W                      global              $0      'GLOBALS'
     3      FETCH_DIM_W                                      $1      $0, 'glob'
     4      ASSIGN_REF                                               !0, $1

答案 3 :(得分:0)

静态类ftw

class View {
    private static $current = null;
    public static function get_current() {
        return self::$current;
    }
}