図に示すように:
ディスカッションへの返信 (解決策)
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でない場合は親クラスの値が子クラスと同じになります。
親クラスにプライベート プロパティがある場合、親クラスのメソッドは親クラスのプライベート プロパティのみを提供します。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません
