2017-10-11 125 views
-1

我有一个情况我有三类:PHP多类继承

<?php 
class A { 
    protected a_val = 'some_val'; 
    public function read_a_val(return $this->a_val;); 
} 

class B extends A { 
    protected b_val = 'some_val_2'; 
    public function read_b_val(return $this->b_val;); 
} 

class C extends B { 
    protected c_val = 'some_val_3'; 
    public function read_c_val(return $this->c_val;); 
    public function c_read_a_val(return $this->a_val;); 
} 

$obj = new C; 
$val = $obj->read_a_val(); // <-- throws error; undefined method 
$val = $obj->a_val;   // <-- throws error; cannot access protected property 
$val = $obj->c_read_a_val(); // works. 
?> 

我在做什么错? PHP支持多级继承...我错过了什么?看起来像C里面可以访问父类,没问题,但变量$ obj不能。 $ obj是否能够访问A的继承内容(受保护)?注意:使用PHP v5.6.25

+0

'$ obj-> read_a_val()'不应该(和不)抛出任何错误。 – ShiraNai7

+0

编辑问题以匹配您给出的答案对任何其他人都没用 –

+0

在发布答复之前,我实际上已更正了问题,因为我看到我输入了错误信息。 –

回答

0

尝试以下操作:

<?php 
class A { 
    protected $a_val = 'some_val'; 
    function read_a_val(){ return $this->a_val; } 
} 

class B extends A { 
    protected $b_val = 'some_val_2'; 
function read_b_val(){ return $this->b_val; } 
} 

class C extends B { 
    protected $c_val = 'some_val_3'; 
function read_c_val(){ return $this->c_val; } 
    function c_read_a_val(){ return $this->a_val; } 
} 

$obj = new C; 
$val1 = $obj->read_a_val(); 
$val2 = $obj->c_read_a_val(); 

var_dump($val1, $val2); 

你用来编写代码的语法是完全错误的。定义一个方法,正确的方法是:

function read_a_val(){ return $this->a_val; } 

不:

//See the curly braces in the above code and none here. 
public function read_a_val(return $this->a_val;); 

同样在PHP中的所有变量应$$a_vala_val启动。并且protected属性在类及其子类之外不可用。

看一看这些页面:VisibilityA simple tutorialOOP Basics

+0

是的,对不起,我一看到我发布的内容就更正了,但问题仍然存在,为什么$ obj不能从A访问受保护的内容?根据PHP手册,它实现了正常的继承,所以从A继承的所有子类(甚至通过B)都应该可以访问来自A. –

+0

的受保护内容。得到它了。我对它处理'保护'的方式感到困惑。谢谢mega6382。 –