1
class A
{
    public function x()
    {
        echo "Public function in class A<br />";
    }
    private function y()
    {
        echo "Private function in class A<br />";
    }
    public function expose()
    {
        $this->x();
        $this->y();
    }
}

class B extends A
{
    public function x()
    {
        echo "Public function in class B<br />";
    }
    private function y()
    {
        echo "Private function in class B<br />";
    }
}
$y = new A;
$y->expose();

$z = new B;
$z->expose();

A 类的实例化产生以下结果:“A 类中的公共函数 A 类中的私有函数”

B 类的实例化产生以下结果:“B 类中的公共函数 A 类中的私有函数”

谁能解释B类实例化的结果?它不应该调用“B的”私有方法而不是A类的父方法吗?

4

2 回答 2

4

那是因为私有成员不能被继承。

您的B类没有expose()定义方法,因此它将调用A' 方法,该方法调用自己的私有y()方法。

于 2013-02-09T03:48:53.937 回答
1

还有其他要考虑的。如果您想看到与您最初期望的行为相似的东西,您可以使 y() 受保护而不是私有。通过这样做,B 类中的受保护方法将对 A 类中的方法可见,并将按照您的预期运行该类的方法。但是,类 A 和 B 中的受保护方法仍然无法通过 $z->y(); 等外部调用访问。

class A
{
    public function x()
    {
        echo "Public function in class A<br />";
    }
    protected function y()
    {
        echo "Protected function in class A<br />";
    }
    public function expose()
    {
        $this->x();
        $this->y();
    }
}

class B extends A
{
    public function x()
    {
        echo "Public function in class B<br />";
    }
    protected function y()
    {
        echo "Protected function in class B<br />";
    }
}
$y = new A;
$y->expose();

$z = new B;
$z->expose();

将导致:

Public function in class A
Protected function in class A
Public function in class B
Protected function in class B
于 2014-06-16T00:30:02.333 回答