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