跨命名空间对象方向


Cross Namespace Object Orientation?

在开发具有超级对象的面向对象HMVC时,在应用程序过程中的某个时刻,它需要使用名称空间。在这里,名称空间将充当一种"版本控制"不同代码的方法,这些代码可以以相同的方式访问。在下面按比例缩小的示例中,如果我的版本是AB,则我能够使用方法qux执行类Foo。我知道,如果我使用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

已解决。

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

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

这就是抽象方法的作用。

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

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