2013-02-22 75 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