PHP 正在访问 class 中设置的全局变量

PHP accessing global variable set in class

我在这里遗漏了一些基本的东西。我们需要访问函数 do_stuff 中设置的变量 $myvar。这是 class 函数所在的通用片段。 class 及其功能都可以正常工作。

class TestClass {

    public function do_stuff() {
        global $myvar;      
        $myvar= 'the value we want';
    }
}

现在,稍后是错误的地方...

$TestClass = new TestClass();
$TestClass->do_stuff();

function get_var() {
    global $myvar;
    echo $myvar; // here the value does NOT exist
}
get_var();

echo $myvar; // but here the value DOES exist

那么为什么当我们在函数外部访问它时变量存在,但在函数内部访问时它不存在?

注意:这是我们正在做的事情的简化版本,所以虽然这个例子很简单,但它说明了我们面临的问题。我也明白很多人不喜欢全局变量。鉴于正在使用的遗留代码和框架,我们需要解决这个特定问题。

谢谢你的帮助!

正确的是在函数外声明变量,然后用global,或者this调用变量。

$myVar = null;

funcion get_var(){
  global $myVar;
  $myVar = 10;

  for ($i = 0; i < $myVar; $i++){
    var_dump($i);
  }
}

适合我。

 class TestClass {

    public function do_stuff() {
        global $myvar;      
        $myvar= 'the value we want';
    }
}

function get_var() {
    global $myvar;
    echo $myvar; // here the value does NOT exist
}
get_var();

echo $myvar; // but here the value DOES exist

将是你得到的,现在如果你实际使用 class 并执行它。

 class TestClass {

    public function do_stuff() {
        global $myvar;      
        $myvar= 'the value we want';
    }
}


function get_var() {
    global $myvar;
    echo $myvar; // here the value does NOT exist
}

$TestClass = new TestClass();
$TestClass->do_stuff();
get_var();

echo $myvar; 

应该回应你想要的。操作顺序仍然很重要,仅仅因为某些东西被放在 class 中并不意味着它被神奇地执行了。
例如这个

   get_var();
   $TestClass = new TestClass();
   $TestClass->do_stuff();

仍未设置

老实说,我会完全避免使用 global,因为该方法的主要问题是您无法追踪其中的值来自何处,例如使用 class 保存值,然后很容易找到 class。对我来说,使用这样的代码只是开发人员的懒惰。

更新: 那很奇怪,因为 运行 这个:

class TestClass {

    public function do_stuff() {
        global $myvar;
        $myvar= 'the value we want';
    }
}


$TestClass = new TestClass();
$TestClass->do_stuff();

function get_var() {
    global $myvar;
    echo $myvar; // here the value does NOT exist
}
get_var();

echo $myvar;

ON WAMP with php 5.4 工作正常并输出

the value we wantthe value we want

请注意,虽然我 运行 它作为一个完整的块,在同一个文件中。但是我又一次觉得我不得不说你最好将值注入函数而不是用 global 搞砸它是 IMO 应该取消的东西。

$TestClass = new TestClass();


get_var($TestClass->do_stuff());

get_var的目的是什么,我知道这是一个例子。但是您需要 global 来做什么。还有其他事情可以做,例如 throwcatch 异常,debug_backtrace(),依赖注入是显而易见的。

这只是您可以找到的关于该主题的众多文章之一。

http://c2.com/cgi/wiki?GlobalVariablesAreBad

作为专业的 Web 开发人员和 CIO,我不得不同意他们的看法。