ホームページ >バックエンド開発 >PHPチュートリアル >サブクラスオブジェクトのパブリックプロパティにアクセスする親クラスのメソッドについての質問

サブクラスオブジェクトのパブリックプロパティにアクセスする親クラスのメソッドについての質問

WBOY
WBOYオリジナル
2016-06-23 13:43:471070ブラウズ

図に示すように:


ディスカッションへの返信 (解決策)

private $_name = 'Han'; は親クラスのプライベート属性であるため、サブクラスはその値を変更できません。
showName は親クラスのメソッドなので、親クラスの $_name = 'Han'; が出力されます。

プライベートを保護またはパブリックに変更するだけです。

または、Kang クラスの showName メソッドを書き換えます。

<?phpclass Han{    public $p1 = 1;    private $_name = '韩';    public function showName(){        echo '<br>p1='.$this->p1.',_name='.$this->_name;        echo '<br>类:'.get_class($this).',方法:'.__METHOD__;    }}class Kang extends Han{    public $p1 = 10;    public $_name = '康';    public function showName(){        echo '<br>p1='.$this->p1.',_name='.$this->_name;        echo '<br>类:'.get_class($this).',方法:'.__METHOD__;    }}echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';$o = new Kang;var_dump($o);echo '<br>p1='.$o->p1.',_name='.$o->_name;$o->showName();?>

private $_name = 'Han'; は親クラスのプライベート属性であるため、サブクラスはその値を変更できません。
showName は親クラスのメソッドなので、親クラスの $_name = 'Han'; が出力されます。

プライベートを保護またはパブリックに変更するだけです。



私が欲しいのは「説明」、つまり、なぜここでの出力が「Kang」ではなく「Han」なのかということです。 「カン」の属性データを出力することを目的としたものではありません。
「showNameは親クラスのメソッドなので、親クラスの$_name = 'Han';が出力される」というのは簡単な説明ですが、もう少し詳しい説明が欲しいです。
showName が親クラスのメソッドであり、「Han」出力が親クラスのプライベート属性値であることはわかっています。
私が言いたいのは、showName の $this であるオブジェクト "$o" には明らかにパブリック属性 _name と p1 があるということです。なぜ p1 は 10 を出力するのに、_name はパブリック属性ではなくプライベート属性を出力するのでしょうか? ($o には 2 つの _name、つまり $this があり、1 つはパブリック、もう 1 つはプライベートであることがわかります)。
明らかに、外側では $o->_name は "Kang" を出力でき、showName の $this は this $o ですが、内側ではなぜ $o->_name は "Kang" を出力するのでしょうか?

fdipzone ありがとう!

privateは不可侵なのでprivateプロパティは上書きできない

privateは不可侵なのでprivateプロパティは上書きできない


親クラスのプロパティは上書きされていないことが分かりました。しかし、別の疑問が生じます。つまり、var_dump($o) を使用すると、2 つの _name 属性があり、1 つはプライベート、もう 1 つはパブリックであることがわかります。プライベートのものはどのように処理すればよいのでしょうか。常識によれば、プライベート属性は継承できないため、サブクラスで定義された _name はパブリック属性として使用され、親クラスの同じ名前の属性をオーバーライドしません。代わりに、それはサブクラスの「新しい属性」と見なされるべきです。サブクラスオブジェクト $o にあるプライベート $_name をどのように解釈すればよいでしょうか?

しかし、私の混乱はまだこれです: public 属性としての $o->_name には直接アクセスできます (出力 "kan") が、その継承されたメソッド showName では、なぜ $this->_name が public ではないのでしょうか。 _name ですが、プライベートの _name はどうですか?ここで、私のコードで指定された $o と $this は間違いなく「同じオブジェクト」です。

明らかに、外側では $o->_name は "Kang" を出力でき、showName の $this も $o ですが、内側では、なぜ $o->_name は "Han" を出力するのでしょうか。

showName は親クラスのメソッドなので、親クラスの属性 _name が呼び出されます。
そして $o->_name はサブクラス オブジェクトの _name 属性を呼び出すため、Kang の _name が読み取られます

そして private $_name を public $_name; に変更すると、サブクラスがインスタンス化されるときに、サブクラスが使用されますクラスの _name は親クラスの _name をオーバーライドします。つまり、親クラスの _name はサブクラスの _name と等しくなります。

showName を Kang に追加すると、親クラスの showName メソッドがオーバーライドされ、サブクラスの _name が表示されます。

var_dump は、kang の内部状況を反映しており、当然プライベート属性も表示されます

showName メソッドは Han によって定義されており、彼の $this は当然 Han です。プライベート属性 _name は上書きされないため、アクセスできます。彼による
そして、外部からアクセスできるのは、Kang によって定義されたパブリック属性 _name のみです

Kang で showName も定義すると、Kang ではプライベート属性 _name にアクセスできなくなります

var_dump は、kang の内部状況を反映しており、当然のことながら、プライベート属性も表示されます

showName メソッドは Han によって定義されており、彼の $this は当然 Han です。プライベート属性 _name は上書きされないため、彼はアクセスできます
そして、外部はパブリック属性 _name にのみアクセスできます。 Kang によって定義されています

あなたが Kang の場合、showName も定義しているため、Kang ではプライベート属性 _name にアクセスできません



他のことはすべて認識して理解できますが、この文「showName メソッドは Han によって定義されており、彼の $this は当然 Han です」に関しては、実際のテストでは $this と $o が「一致」しており、実際にはオブジェクトであるということです。 ($o)。
さらに、var_dump($o) を通して見たオブジェクト $o の内部状況から、確かに 2 つの _name 属性があり、1 つはパブリック、もう 1 つはプライベートであることがわかります。または、理論的には、これらの両方に showName から実際にアクセスできます。たとえば、Han クラスのプライベート属性 _name をコメントアウトすると、そのサブクラスのパブリック _name 属性にアクセスできます。
実際、私の質問はここにあります。なぜ共有 _name ではなく、プライベート _name がここに出力されるのですか。
知りたいのは理論的な説明というか、原理的な説明です。現象としては、「showNameはHanクラスで定義されているので、Hanクラスのプライベートプロパティにアクセスできるからです。」 " 私はそれを知っている。
ここで確かなことは、$o オブジェクトには 2 つの _name 属性があり、1 つは Han クラスのプライベート属性、もう 1 つは Kang クラスのパブリック属性であり、どちらも showName() メソッドでアクセスできるということです。考えられる説明の 1 つは、メソッドが、そのメソッドが配置されているクラス内で定義されている「同じクラスの」プロパティに優先的にアクセスするということです。しかし、実はこの説明は私の想像にすぎず、どこにも見たことがありません。そこで、この現象についてさらに詳しく説明したいと思いました。
大丈夫?ありがとう!

echo '54de8cc1743d4cfd6ff0e356f8917b7dClass:' .',Method:'.__METHOD__ に変更します。
結果を見ればわかります
0c6dc11e160d3b678d68754cc175188ap1=10,_name=Kang0c6dc11e160d3b678d68754cc175188ap1=10,_name=Han0c6dc11e160d3b678d68754cc175188aクラス: Han、メソッド: Han::showName

Kong は Han のメソッドを継承していますがshowName (__METHOD__ は Han::showName)
しかし、彼はまだ Han クラスで動作しており、 $this->_name は Han::_name であり、常にそうなります
Han::_name が private でない場合、 Kong::_name Han::_name は上書きされます
ただし、$this->_name が Kong::_name にアクセスするという意味ではなく、実際には Han::_name のままですが、2 つの値は同じです

さて、今回の9階のxuzuning司会者の解説は、私が求めているものに近いです、ほほ。

詳細についてはまたお話しさせていただきます。

get_class($this) を __CLASS__ に置き換えるように要求されました。私が取得したのはクラス名「Han」でした。ただし、__CLASS__ は常にメソッドが属するクラスを参照するため、これは showName メソッドが存在するクラスのみを表示します。しかし、なぜ $this->_name が showName メソッドで "Kang" ではなく "Han" になっているのかは説明されていません。さらに、ここで、$this は "kang" クラスのオブジェクトです...しかし、突然、これは確かに "Han" クラスのオブジェクトであることに気づきました。なぜなら、Kang は Han のサブクラスであり、サブクラスのオブジェクトは当然オブジェクトであるはずだからです。親クラスの。この説明から、$this->_name は実際に Han::_name の値を出力するはずです。
しかし、後の説明では、showName メソッドは「Han クラスでまだ動作し、$this->_name は Han::_name であり、常にそうなります」とありますが、これは絶対的すぎますか?たとえば、Han に _name 属性がない場合、$this->_name は Kang クラス オブジェクト $o (つまり、ここでは $this) の _name にアクセスします。しかし、後で Han::_name がプライベートでない場合、サブクラスによって上書きされ、この時点でアクセスされる $this->_name は Han::_name のままであると説明されましたが、これは私にとって非常に新しいことです。たくさんの恩恵を受けました。

Han::_name が private でない場合、サブクラスによって上書きされ、このときアクセスされる $this->_name はこのように Han::_name のままになります。
は2つのクラスの値ですが、privateでない場合は親クラスの値が子クラスと同じになります。

親クラスにプライベート プロパティがある場合、親クラスのメソッドは親クラスのプライベート プロパティのみを提供します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。