【问题标题】:Overriding parent function覆盖父函数
【发布时间】:2017-05-31 19:47:33
【问题描述】:

这个问题被问了很多次,但似乎没有一个答案适用于此。

我有以下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-&gt;Before() 运行,而是运行PageBase::Before()。

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

亲切的问候

【问题讨论】:

  • 见Late Static Binding。或者更好的是,不要使用静态。即,而不是 self::Before(); 使用 $this-&gt;Before();。
  • @AlexHowansky 谢谢,不知道我是怎么错过的,解决了!

标签: php class parent overloading


【解决方案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"

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2010-10-25
    • 1970-01-01
    相关资源
    最近更新 更多