2013-04-13 69 views
0

我知道当我希望它只对所有扩展当前类以及当前类的类可用时,我应该创建一个“protected”方法。从父类访问受保护的方法

好的,grandChildClass :: method2()应该受到保护,因为孙子是从子级扩展而来的。

但是,如果从父类,如parentClass :: method2()访问它应该是什么?

class parentClass 
{ 
    public function method1() {$this->method2();} 
} 

class childClass extends parentClass 
{ 
    protected function method2() {} 
} 

class grandChildClass extends childClass 
{ 
    public function method3() {$this->method2();} 
} 

回答

2

如果试图

$p = new parentClass; 
$p->method1(); 

你会得到未定义的方法一个致命的错误。

Fatal error: Call to undefined method parentClass::method2() in ... on line ...

然而,这将正常工作:

$c = new childClass; 
$c->method1(); 

$g = new grandChildClass; 
$g->method1(); 
$g->method3(); 

所有这些都将调用method2childClass定义。

+0

为了使这个更清洁,'parentClass'可以定义'method2'的纯虚拟版本,如下所示:'virtual method2()= 0;'。这将显式地要求任何childClass实现'method2()'函数,以便它可以被称为我的'parentClass'方法。 – Alan

+0

谢谢,我希望它能像你说的那样工作!我迷茫了自己,并且正在访问一个在我的parentClass中定义的方法,但是在grandchildClass中,很显然,childClass方法工作得很好。 – user1032531

+0

@Alan:PHP中没有'virtual'方法。你可以将一个类及其方法定义为'abstract'(这意味着它们只有定义并且不能被实例化)。 –

相关问题