2017-10-11 131 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。 –