2

具有以下类层次结构:

class TheParent{

    public function parse(){
        $this->validate();
    }

}

class TheChild extends TheParent{

    private function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse();

这将起作用的步骤顺序是什么?

问题是当我运行该代码时,它给出了以下错误:

Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4

由于TheChild继承自TheParent不应该$this调用parse()引用的实例$child,所以validate()parse()?

注意:
在做了一些研究之后,我发现这个问题的解决方案要么根据PHP 手册中的这个注释validate()来制作函数,虽然我不完全理解为什么它在这种情况下工作。 protected

第二种解决方案是在父项中创建一个abstract protected方法validate()并在子项中将其覆盖(这将是多余的)到第一个解决方案,因为protected可以从父项访问子项的方法?!!

有人可以解释在这种情况下继承是如何工作的吗?

4

4 回答 4

17

其他海报已经指出,需要保护这些方法才能访问它们。

我认为您应该在代码中再更改一件事。您的基类parent依赖于在子类中定义的方法。那是糟糕的编程。像这样更改您的代码:

abstract class TheParent{

    public function parse(){
        $this->validate();
    }

    abstract function validate();

}

class TheChild extends TheParent{

    protected function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse(); 

创建一个抽象函数确保子类肯定有这个函数validate,因为抽象类的所有抽象函数都必须实现才能继承自这样的类

于 2012-10-17T13:02:12.270 回答
4

您对继承的想法是正确的,而不是可见性。

protected 可以被类以及继承的类和父类使用,private 只能在它定义的实际类中使用。

于 2012-10-17T12:54:00.267 回答
2

Private 只能由定义的类访问,既不是父类也不是子类。

改用受保护的:

class TheParent{

    public function parse(){
        $this->validate();
    }

}

class TheChild extends TheParent{

    protected function validate(){
        echo 'Valid!!';
    }
}

$child= new TheChild();
$child->parse();
于 2012-10-17T12:55:57.503 回答
0

来自 PHP 文档

其他对象的可见性

相同类型的对象将可以访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时,特定于实现的细节是已知的。

Private 只能通过class which defines or Same object typeExample访问

class TheChild {
    public function parse(TheChild $new) {
        $this->validate();
        $new->validate(); // <------------ Calling Private Method of $new
    }
    private function validate() {
        echo 'Valid!!';
    }
}

$child = new TheChild();
$child->parse(new TheChild());

输出

有效!!有效!!

于 2012-10-17T13:02:01.943 回答