2013-02-22 71 views
-1

在开发具有超级对象的面向对象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

+0

这是没有意义的。你不能在静态上下文中使用'$ this'。如果没有明确定义方法,则不应该使用静态方法。而且你不应该在构造函数中“做工”。 – 2013-02-22 16:13:49

+0

@tereško我在问它如何是一个静态的上下文,如何避免它是一个静态的上下文,它只是一个例子。 – escproxy 2013-02-22 16:15:47

+2

你真的不应该在扩展类上调用函数;父母不应该知道。 – 2013-02-22 16:16:23

回答

1

解决。

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

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

这是抽象方法的用途。

你应该声明Master作为一个抽象类,并qux作为一个抽象的方法:

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

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

这在相反的方向工作..:/ – escproxy 2013-02-22 18:07:03