2017-10-11 7 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_valないa_valのような$で開始する必要があります。 protectedプロパティは、クラスとその子クラスの外部では使用できません。 VisibilityA simple tutorial、およびOOP Basics

+0

ええ、申し訳ありませんが、私が投稿した内容を見ればすぐに修正されましたが、なぜ$ objがAから保護されたコンテンツにアクセスできないのですか? PHPのマニュアルによれば、それは通常の継承を実装しているので、Aから継承したすべてのサブクラスはAからの保護されたコンテンツにアクセスする必要があります。 –

+0

Ahh、ok。とった。私はそれが「保護された」方法を混乱させました。ありがとうmega6382。 –