目次
ディスカッションへの返信 (解決策)
ホームページ バックエンド開発 PHPチュートリアル サブクラスオブジェクトのパブリックプロパティにアクセスする親クラスのメソッドについての質問

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

Jun 23, 2016 pm 01:43 PM

図に示すように:


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

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 '
Class:'.get_class($this).',Method:'.__METHOD__;
を echo '
Class:' .',Method:'.__METHOD__ に変更します。
結果を見ればわかります

p1=10,_name=Kang
p1=10,_name=Han
クラス: 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

See all articles