超级对象的变量范围问题

时间:2010-11-19 05:15:14

标签: php

我正在为我正在研究的框架项目创建一个“超级对象”(类似于CodeIgniter)。

我想创建一个超级对象,我的所有其他类都将运行。我这样做了,但似乎我无法在每个类中使用我的超级对象的对象而不在每个函数中使用global关键字。

我有这样的事情:

class a
{
    function aa()
    {
        return 'class a';
    }
}

class b
{
    function bb()
    {
        $blah->a->aa();
    }
}

class superobj
{
    function loadClass($class)
    {
        $this->$class = new $class;
    }
}

class blah extends superobj
{
    function __construct()
    {
        $this->loadClass('a');
        $this->loadClass('b');
    }
}

$blah = new $blah;

所以如果我运行它,我会收到一个错误,因为我无法访问aa方法。如果我将全局$ blah放入方法bb中,那么它可以工作(或者至少在我的真实项目中,我不知道这个5秒的模型嘿嘿)。

那么有没有办法让$ blah对象全局化,这样我就不需要为每个方法引用它了,还是有更好的方法来实现我想做的事情?

我不是很擅长OOP ......

1 个答案:

答案 0 :(得分:3)

function bb() {
    $blah->a->aa();
}

实际上,与任何函数一样,此函数的范围没有变量。 <{1}}既未传递给函数,也未在函数中定义,因此它不存在。

如果您的对象依赖于$blah的实例,则应将其传递给构造函数。

blah

或者,使用一个静态类来保存对全局对象的引用,并根据请求返回它们(注册表模式,如class b { var $blah = null; function __construct($blah) { $this->blah = $blah; } function bb() { $this->blah->foo(); } } $b = new b($instanceOfBlah); )。

请勿使用$blah = Registry::get('blah')。只是不要。