跨命名空间对象方向?

时间:2013-02-22 15:52:50

标签: php namespaces

在开发具有超级对象的面向对象的HMVC时,在应用程序过程中的某个时刻,它需要使用命名空间。在这里,名称空间将充当“版本化”可以以相同方式访问的不同代码的方法。在下面的缩小示例中,如果我处于版本Fooqux,我可以使用方法A执行类B。我明白,如果我使用self::而不是$this,问题就会消失,但我希望避免这种情况。目前,我收到以下PHP错误:

Fatal error: Using $this when not in object context

所以我的问题是,我如何在这个特定的背景下使用$this

namespace
{
    $gamma = new \Gamma();
    $gamma->execute('A', 'Foo', 'qux');

    // ...

    class Alpha
    {
        // ...
    }
    class Beta extends Alpha
    {
        public function foo($input)
        {
            echo $this->bar($input);
        }
        public function bar($input)
        {
            return $input;
        }
    }
    class Gamma extends Beta
    {
        public function execute($space, $class, $method)
        {
            call_user_func_array(array($space . '\\' . $class, $method), array());
        }
    }
}
namespace A
{
    class Foo extends \Gamma
    {
        public function qux()
        {
            $this->foo('I like turtles');
        }
    }
}
namespace B
{
    class Foo extends \Gamma
    {
        public function qux()
        {
            $this->foo('I like strawberries');
        }
    }
}

预期输出为:

"I like turtles"

非常感谢任何建议,答案和指导。 :3

2 个答案:

答案 0 :(得分:1)

解决。

我正在静态通过call_user_func_array函数传递课程。因此,我无法使用$this。因此,需要启动所请求的类,并将其作为变量传递,如下所示:

// ... Continuing from Beta::execute() ...
$class = $space . '\\' . $class;
$class = new $class();
call_user_func_array(array($class, $method), array());

答案 1 :(得分:0)

这就是抽象方法的用途。

您应该将Master声明为抽象类,并将qux声明为抽象方法:

abstract class Master
{
    public function __construct()
    {
        $this->qux();
    }
    abstract public function qux();
}

class Foo extends Master
{
    public function qux()
    {
        ....
    }
}