如何从实例化类调用父方法


How can I call a parent method from the instantiating class?

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

是否有任何方法,我可以引用我的addError方法从父类创建的助手类的实例,直接从助手类本身的方法内?

<>之前类baseview {…addError($message) {…}…}类pageview扩展baseview {…$helper = new helper();…}类助手{…myFunction($var) {If ($var){…}else {classthatinstantiatedme::addError('错误消息')}}…}之前

~ OR ~

谁能建议一个更好的方法来构建我的系统,以更好地处理这种情况?

两个简单的解决方案是:

将父类存储在helper类中:

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

否则,将addError函数设置为公共和静态,以便您可以在helper类中调用它,而无需存储父类实例:

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

从你的例子中,我本以为你的意思是baseview被普遍使用,所以"baseview::addError('Error Message');"

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

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

…}

类助手{保护创造者美元;…公共函数myFunction($creator, $var) {

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

}

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

这里是 pdf所有程序员应该至少读过一次:编写可测试代码

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

如果你喜欢视频,你可以看看这些:Misko的会议在谷歌