ホームページ >バックエンド開発 >PHPチュートリアル >サブクラスオブジェクトのパブリックプロパティにアクセスする親クラスのメソッドについての質問
図に示すように:
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'; が出力されます。
プライベートを保護またはパブリックに変更するだけです。
privateは不可侵なのでprivateプロパティは上書きできない
privateは不可侵なのでprivateプロパティは上書きできない
明らかに、外側では $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 にアクセスできません
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でない場合は親クラスの値が子クラスと同じになります。
親クラスにプライベート プロパティがある場合、親クラスのメソッドは親クラスのプライベート プロパティのみを提供します。