2017-05-31 236 views
0

這是一個被問了很多次的問題,但沒有一個答案似乎適用於此。覆蓋父功能

我有以下PageBase類:

<?php 
    class PageBase { 
     public $templatefile = '404'; 

     function Before() {} 
     function After() {} 

     function Display() { 
      $smarty = System::GetSmarty(); 
      $smarty->display('views/'.$this->templatefile.'.tpl'); 
     } 

     function Run() { 
      self::Before(); 
      self::Display(); 
      self::After(); 
     } 
    } 

所有這個類的做的就是爲我的其他網頁的基礎;這些頁面可能或不需要在顯示頁面之前/之後運行自己的代碼,並且它們通常都有自己的$templatefile。例如我的Home類;

<?php 
    class Home extends PageBase { 
     public $templatefile = 'home'; 

     function Before() { 
      var_dump($_REQUEST); 
     } 
     function After() {} 
    } 

我遇到的問題是,正確的模板文件(home)被加載,但在Home::Before()代碼不通過實例$home->Before()跑,PageBase::Before()改爲跑了。

解決此問題的正確方法是什麼? PHP提供任何方法來覆蓋父級的功能嗎?

親切的問候

+3

請參閱[後期靜態綁定](http://php.net/manual/en/language.oop5.late-static-bindings.php)。或者更好的是,不要使用靜態。即,而不是'self :: Before();'使用'$ this-> Before();'。 –

+0

@AlexHowansky謝謝,不知道我是如何錯過的,修復它! – Ieuan

回答

1

就個人而言,我會用一個接口來均勻性和調用父一旦變量被設置,就像這樣:

<?php 
Interface PageBase { 
    public function Before(); 
    public function After(); 
    public function Display(); 
    public function Run(); 
} 

class Page Implements PageBase { 
    public $templatefile = '404'; 

    function Before() {} 
    function After() {} 

    public function Set($page) { 
     if (class_exists($page)) { 
      $class = new $page($page); 
      return $class; 
     } 

     return false; 
    } 

    function Display() 
    { 
     $smarty = System::GetSmarty(); 
     $smarty->display('views/' . $this->templatefile . '.tpl'); 
    } 

    function Run() 
    { 
     self::Before(); 
     self::Display(); 
     self::After(); 
    } 
} 

class Home extends Page Implements PageBase 
{ 
    public $templatefile = 'home'; 

    function After() { parent::After(); } 
    function Display() { parent::Display(); } 
    function Run() { parent::Run(); } 

    function Before() { 
     var_dump($_SERVER); 
    } 
} 

$Page = new Page(); //Create a new page instance for all of the functionality 
$home = $Page->Set("Home"); //Returns a new class of Home 
$home->Display(); //Displays the templatefile "home" 

我希望這有助於。