开发者

Methods for accessing PHP global variables [closed]

开发者 https://www.devze.com 2022-12-31 06:35 出处:网络
开发者_运维问答As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references,or expertise, but this question will likely so
开发者_运维问答 As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance. Closed 10 years ago.

$GLOBALS['current_view'] and global $current_view, which do you prefer and why?


Neither, pass parameters into the methods. Every time you use globals, God kills a kitten.


If I must use globals, and I avoid them like the plague, I use global $current_view. I just prefer to always have a locally scoped variable rather than relying on super globals. But I think its a matter of preference.


Personally, I prefer the $GLOBALS['glob'] syntax because I can just copy paste the code without having to worry about declaring variables as globals. Keep in mind that you should try to keep globals to a minimum (maybe just global configuration directives, and even there...).

However, the two methods are not exactly synonymous; there's a slight difference:

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

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

The first one will emit a notice if the global 'glob' does not exist. The second one won't.

In the first case, sending $GLOBALS['glob'] as an argument compiles to:

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

You're fetching GLOBALS and its index glob in a read context; no variable is created.

The second one compiles to

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

You are creating a reference to the global glob, so it is implicitly created if it doesn't exist.

Also:

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

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

The function func() will actually unset the global, func2_unset will merely destroy the reference that was created.

Note that func2 is very similar to:

function func3() {
    $glob =& $GLOBALS['glob'];
}

This one is however potentially less efficient. It compiles to

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


static classes ftw

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

精彩评论

暂无评论...
验证码 换一张
取 消