2011-06-15 163 views
5

我試圖創建一個簡單的MVC我個人使用,我真的可以使用回答這個簡單的問題訪問父屬性這個

class theParent extends grandParent{ 

    protected $hello = "Hello World"; 

    public function __construct() { 
     parent::__construct(); 
    } 

    public function route_to($where) { 
     call_user_func(array("Child", $where), $this); 
    } 
} 

class Child extends theParent { 

    public function __construct() { 
     parent::__construct(); 
    } 

    public function index($var) { 
     echo $this->hello; 
    } 

} 

$x = new theParent(); 
$x->route_to('index'); 

現在Child::index(),這將引發一個致命的錯誤:Using $this when not in object context但如果我要使用echo $var->hello,它工作得很好。

我知道我可以使用$var訪問父級中的所有屬性,但我寧願使用$this

+0

/Child :: index()是拋出錯誤的地方嗎?我無法從您發佈的代碼中看到它。 – hakre 2011-06-15 21:05:48

回答

4

您沒有Child的實例在您正在執行時調用非靜態方法$x->route_to('index');您調用該方法時未調用實例的方式暗含靜態。

有兩種方法可以糾正它。要麼使Child類的方法靜態:

class Child extends theParent { 

    public function __construct() { 
     parent::__construct(); 
    } 

    static public function index($var) { 
     echo self::$hello; 
    } 

} 

...或者讓孩子類的實例父使用方法:

class theParent extends grandParent{ 

     protected $hello = "Hello World"; 
     private $child = false 

     public function __construct() { 
      parent::__construct(); 
     } 

     public function route_to($where) { 
      if ($this->child == false) 
       $this->child = new Child(); 
      call_user_func(array($this->child, $where), $this); 
     } 
    } 

當然,這兩個樣本是相當通用的,沒用,但你看到了這個概念。

+0

太棒了,非常感謝。 – 2011-06-15 23:31:54

6

通過書寫call_user_func(array("Child", $where), $this)您正在靜態調用該方法。但是由於你的方法不是靜態的,你需要某種對象實例:

call_user_func(array(new Child, $where), $this); 

Documentation on callback functions

+0

謝謝,我喜歡這個。我可以使用變量創建此類的新實例嗎?這樣$ var =「Child」;然後call_user_func(array(new $ {$ var},$ where),$ this);或類似的東西?上次我嘗試了,你不能將對象賦給字符串 – 2011-06-15 22:46:43

+0

你的語法幾乎是正確的,但是你只需要使用'new $ var'而不是'new $ {$ var}'。 (後者有不同的含義,它會使用變量實例化類。) – NikiC 2011-06-16 05:17:55

1

$this可讓您訪問當前對象中所有可見/可訪問的內容。這可以在課堂本身(本)或其任何父母的公共或受保護的成員/功能。

如果當前類重寫父類的某些內容,則可以使用parent關鍵字/標籤明確地訪問父方法,而無論該方法是否爲靜態方法,都會向其添加::

受保護的變量只存在一次,因此您不能使用parent來訪問它們。

這個使用信息?