【问题标题】:How can I call a parent method from the instantiating class?如何从实例化类中调用父方法?
【发布时间】:2011-04-20 14:16:39
【问题描述】:

在我的项目中,我的所有视图类都是基础视图类的扩展,它处理视图的所有常见方面,包括错误消息。在其中一个视图扩展中,我正在创建另一个可能需要输出错误消息的“助手”类的实例。

有什么方法可以直接从帮助类本身的方法中从创建帮助类实例的类的父类引用我的addError 方法?

例如

类基础视图 { ... 公共函数 addError($message) { ... } ... } 类网页浏览扩展基本视图{ ... $helper = 新助手(); ... } 类助手{ ... 公共函数 myFunction($var) { 如果($var){...} 否则 { theClassThatInstantiatedMe::addError('错误消息') } } ... }

~或者~

有人可以建议一种更好的方法来构建我的系统以更好地处理这种情况吗?

【问题讨论】:

    标签: php model-view-controller class methods extension-methods


    【解决方案1】:

    2 个简单的解决方案是:

    将父类存储在辅助类中:

    class pageview extends baseview {
        ...
        $helper = new helper($this);
       ...
    }
    
    class helper {
        function __construct($parent)
        {
            $this->_parent=$parent;
        }
        ...
        $this->_parent->addError("...");
    }
    

    否则,将 addError 函数设为 public 和 static,这样您就可以在辅助类中调用它,而无需存储父类实例:

    class baseview {
        ...
        static public function addError($message) {
            ...
        }
        ...
    }
    
    class helper{
         ...
         baseview::addError("...");
    }
    

    【讨论】:

    • 我更喜欢你第二个建议的简洁性,所以我同意了。我知道必须有一个简单直接的方法来做到这一点,非常感谢!
    • 哎呀!实际上使用static 意味着我无法使用$this->var 访问类变量,我需要这样才能让基类(以及随后的子类)“知道”何时显示错误消息!所以我已经切换到你的第一个例子,一切都很好!
    【解决方案2】:

    从您的示例中,我假设您的意思是要普遍使用 baseview,因此“baseview::addError('Error Message');”

    但从文本中,我推测可能有不同的类。在这种情况下,您必须将创建类的引用传递给帮助程序,如下所示:

    class pageview extends baseview {
    ...
    $helper = new helper($this);
    

    ... }

    类助手{ 受保护的$创作者; ... 公共函数 myFunction($creator, $var) {

        $this->creator = $creator;
        if( $var ) { ... }
        else { $creator->addError('Error Message') }
    }
    ...
    

    }

    【讨论】:

      【解决方案3】:

      如果你想要干净的代码,你应该分离接线(对象创建)和逻辑。

      这里是 THE pdf,所有编码人员都应该至少阅读一次:Writing Testable Code

      这是在 Misko Hevery 的博客上找到的 pdf(谷歌“干净代码”传道者)。

      如果您喜欢视频,可以查看这些:Misko's conferences at Google

      【讨论】:

        猜你喜欢
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-08
        • 2015-09-18
        相关资源
        最近更新 更多