如何在PHP中从类中获取“全局变量”

时间:2010-07-16 08:08:17

标签: php

  

可能重复:
  Access global variable from within a class

我收到了以下代码:


$foo = 'foo';

class bar
{
    public function __construct()
    {
        var_dump($foo);
    }
}

$bar = new bar();

这会导致NULL值。是否有可能在课堂栏内达到$ foo?用PHP中的一些奇特的魔术词?

6 个答案:

答案 0 :(得分:4)

是的,这个神奇的词被称为参数

class bar
{
    public function __construct($foo)
    {
        var_dump($foo);
    }
}
$foo = 'foo';
$bar = new bar($foo);

您不希望代码中包含global关键字。功能(和方法)应该是可隔离的可测试单元。如果使用global关键字,则实际上是在函数范围内创建对全局范围的依赖关系。通过参数注入依赖项会更好,更易于维护。

答案 1 :(得分:3)

global $foo;
var_dump($foo);

请参阅http://www.ideone.com/OOAsg

(为什么不通过论证?)

答案 2 :(得分:1)

如果您尝试访问那里的数据库对象,也许您想要查看Singleton Pattern。此外,您可以考虑使用注册表:

class R {
    public static $foo;
    public static $db;
    public static $user;
    // ...
}
// later in code
R::$db = new PDO(...);
R::$user = new User();
// ...

然后,您可以随时随地访问这些变量(包括类,函数和全局空间。)

(好的,我知道这不是真正的getset方法的注册表,但我认为这已经足够......)

答案 3 :(得分:1)

Emil - 请在此处提出建议,不要因为保持代码自包含而懒惰。当然,系统会在程序的不同部分以各种方式使用后引用变量。

然后就是实例实例化的问题。你如何合理地跟踪新类的调用顺序以及这可能对你的全局变量产生的影响?

那个以及你最后可能会在开发中忽略变量的目的并将其用于其他东西的事实只会导致大量的死胡同。

一句话 - 不要为了你在2个月的时间内的理智而这样做......

吉姆

答案 4 :(得分:0)

这就是我解决它的方式。它确实清除了我的所有问题


class bar
{
    public static $foo;
}

$bar::foo = 'foo';

感谢您的所有答案

答案 5 :(得分:0)

$foo = 'foo';
class bar
{
    public function __construct()
    {
    // pay attention to "global"
    global $foo; 
        var_dump($foo);
    }
}
$bar = new bar();