覆盖父功能

时间:2017-05-31 19:47:34

标签: php class parent overloading

这个问题经过多次询问,但这些答案似乎都不适用于此。

我有以下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()运行,{而是运行{1}}。

解决这个问题的正确方法是什么? PHP是否提供了覆盖父函数的任何方法?

亲切的问候

1 个答案:

答案 0 :(得分: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"

我希望这会有所帮助。