2013-02-09 118 views
0
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类instantioation产生以下结果: “类公共函数类A A 私有函数”PHP类继承私有方法不是孩子(扩展)类正确调用

的instantioation B类产生以下结果: “B类中的公共功能 A类中的私有功能”

任何人都可以解释B类实例的出现吗? 它不应该调用“B”私有方法而不是A类的父方法?

回答

4

这是因为私人成员不能被继承。

B类没有定义的expose()方法,所以它会调用A的方法,它调用自己的私人y()方法。

0

还有其他值得考虑的事情。如果你想看到类似于你最初期待的行为的东西,你可以使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