2016-09-04 8 views
3

私はPHPを初めて使い、2つの質問があります。私は次のコードを試したとき:"this" in class継承、PHP

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    public $id = 1; 

    public function id(){ 
     return $this->id; 
    } 

}; 


$d1 = new Derived(); 

echo $d1->id();//echo 1 
echo $d1->getId();//echo 1 
?> 

上記のコードは2つの1をエコーし​​ます。

私は次のコードをしようとしたときただし、:

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    private $id = 1; 
    public function id(){ 
     return $this->id; 
    } 
}; 

$d1 = new Derived(); 

echo $d1->id();//echo 1 
echo $d1->getId();//Cannot access private property Derived::$id 
?> 

を第2の機能の呼び出しは私にエラー「派生プライベートプロパティにアクセスすることはできません:: $ ID」を提供します。だから私の質問は$ d1-> getId()を作成したときに参照されたBaseの$ thisは何ですか?

$ thisがd1インスタンスを参照している場合、private $ idにアクセスできるはずです。しかし、$ thisが$ d1の内部のBaseを参照する場合、Derivedクラスから$ idプロパティを取得するにはどうすればよいですか?ありがとう!

+0

'id()'メソッドは冗長です:継承した 'getId()'メソッドと同じことを行います – RomanPerekhrest

+0

'$ id'はDerivedクラスではプライベートなので、Baseクラスではアクセスできません – RiggsFolly

+3

http:// stackoverflow 。com/questions/7469759/access-child-property-from-parent-scope – RomanPerekhrest

答えて

3

私の質問は、私が $ d1-> getId()を作ったときに参照したBaseの$です。

$thisは、どんなクラスのnewキーワードを使用して作成されたインスタンス化されたオブジェクトのインスタンスである - それは、そのクラスのインスタンスだ、クラス自体ではありません。あなたのケースでは、をnew Derived()で作成したため、$thisはDerivedのインスタンスです。基本プライベートプロパティは、それを定義したクラスにexclusiveであるため、BaseはDerivedのプライベートプロパティにアクセスできません。継承クラスとは共有しません。

派生クラスから$ idプロパティを取得するにはどうすればよいですか?

あなたは保護視界を探している:それを継承している他のクラスと

<?php 
class Base{ 
    public function getId(){ 
     return $this->id; 
    } 
}; 


class Derived extends Base{ 
    protected $id = 1; 
    public function id(){ 
     return $this->id; 
    } 
}; 

$d1 = new Derived(); 

echo $d1->id(); 
echo $d1->getId(); 
?> 

保護された可視性を共有します。

派生クラスにプロパティが存在すると予想するのは悪いことです。派生クラスがそのプロパティを指定することは保証できません。ベースを抽象として定義し、その存在をチェックすることを検討するかもしれません。

+0

だから、$ d1-> getId()を呼び出すと、getId関数の$ thisは$ d1の内部で作成された基本インスタンスですか? –

+1

いいえ、 '$ this'はDerived(' new Derived() 'で作成したため)のインスタンスです。 DerivedはBaseからメソッドを継承するだけですが、BaseがDerivedへのプライベートレベルのアクセスを取得するわけではありませんが、それらは依然として別のクラスです。 – HPierce

+0

ありがとう!わかった! –

-1

可視性としてプライベートの代わりに保護を使用します。

プライベートは、あなたの属性が現在のオブジェクトでのみアクセス可能であるのに対して、protectedはparentおよびchilds要素からアクセス可能であることを意味します。

+0

それは問題を解決するかもしれませんがそれは本当に質問に答えるものではありません。 – jeroen

+0

私はしたいです...しかし、私は私の答えを編集することはできません! – enrico69

+0

これは奇妙なことですが、あなた自身の答えを編集できない理由は何もわかりません... – jeroen

1

private修飾子は、クラスプロパティがそのクラス内からのみアクセス可能であることを示します。サブクラスまたはスーパークラスはそのプロパティにアクセスできません。

例では、$ idはDerivedクラスのプライベートなので、Baseクラスからはアクセスできません。