PHP访问类中设置的全局变量

时间:2015-07-24 18:04:34

标签: php function class global-variables

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

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

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

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

谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

 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;

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

答案 1 :(得分:-1)

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

ctype.h

对我来说很好。