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