-1

在开发具有超级对象的面向对象的 HMVC 时,在应用程序过程中的某个时刻,它需要使用命名空间。在这里,命名空间将充当“版本化”不同代码的方法,这些代码可以以相同的方式访问。在下面的缩小示例中,Foo如果qux我在 versionAB. 我知道如果我使用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

4

2 回答 2

1

解决了。

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

// ... Continuing from Beta::execute() ...
$class = $space . '\\' . $class;
$class = new $class();
call_user_func_array(array($class, $method), array());
于 2013-02-22T20:01:39.753 回答
0

这就是抽象方法的用途。

您应该声明Master为抽象类和qux抽象方法:

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

class Foo extends Master
{
    public function qux()
    {
        ....
    }
}
于 2013-02-22T17:11:02.383 回答