2017-05-31 132 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" 

我希望这有助于。