【问题标题】:PHP accessing global variable set in classPHP访问类中设置的全局变量
【发布时间】:2015-07-24 18:04:33
【问题描述】:

我在这里遗漏了一些基本的东西。我们需要访问在函数 do_stuff 中设置的变量 $myvar。这是该函数所在类的广义 sn-p。这个类和它的功能都可以正常工作。

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

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

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

感谢您的帮助!

【问题讨论】:

  • 您能否使用将值设置为 $myvar 的部分更新此简化版本的代码?在这个例子中我没有看到 TestClass::do_stuff 被调用。
  • 你做这些事情的顺序是什么,你从哪里调用这个类,你什么时候包含它。如果您在设置之前尝试获取该值,那么它当然会为空
  • @ArtisiticPhoenix 我更新了代码以指示如何使用该类。为了简单起见,我之前省略了它,但我显然不够清楚。
  • @MattSmith - 看到更新对我来说效果很好,这是你拥有的函数,而不是闭包,对吧?

标签: php function class global-variables


【解决方案1】:
 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 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; 

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

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

仍未设置

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

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

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;

在 WAMP 上使用 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,我必须同意他们的观点。

【讨论】:

  • 我更新了代码以指示如何使用该类。为了简单起见,我之前省略了这一点,但我显然还不够清楚。感谢您的帮助!
【解决方案2】:

正确的会在函数外声明变量,然后使用全局,或者this调用变量。

$myVar = null;

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

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

对我来说很好。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多