ホームページ >バックエンド開発 >PHPチュートリアル >PHP で親クラスがサブクラスのメソッドを呼び出す
朝食を食べているときにここで質問を見ました。これは少し興味深いものです。一般に、親クラスがサブクラスのメソッドを呼び出すことは推奨されませんが、メソッドを多様化したい場合は理解できます。
この場合、強い抑制が必要です。そうしないとバグが発生しやすくなります。継承関係では、親クラスはサブクラスを知らないため、この状況はインターフェイスまたは抽象クラスを使用して制限する必要があります。
最初にコードを見てください
<?phpclass A{ public function run() { //我在这里把对象打印出来,方便理解 var_dump($this); $this->say(); }}class B extends A{ protected function say() { echo 'B-say'; }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say
親クラスで $this がすでに B を指しているのがわかりましたか。
継承を分解してみると、実際には B は次のようになりました:
<?phpclass B{ public function run() { //我在这里把对象打印出来,方便理解 var_dump($this); $this->say(); } protected function say() { echo 'B-say'; }}$b = new B();$b->run();//结果:object(B)#1 (0) { } B-say
B は A のメソッドを継承するので、親クラス A がサブクラス B のメソッドを呼び出すことに成功したようです。
質問で述べたように、say() メソッドがプライベートになった後、呼び出しは失敗します。これがプライベート スコープの役割です。
run() 継承の本質を見てみましょう。
分解されたコードでは、確かにクラス B に run() がありますが、この run() はその親 A に属します。これは「借用」することしかできず、「所有権」は B に属するため、run() は次のようになります。呼ばれる時間が来たら、お父さんAのところに走って使わなければなりません。
注意、お父さんAが使用する場合、 使用環境はAです。
しかしプライベートは、私が変更したものは、現在のクラスでのみ使用できます、そして私なしでは誰もそれを使用できないと言いました。
それで、エラーを報告しました。
継承呼び出し後の分解コード:
<?phpclass A{ public function run() { $b = new B(); $b->say();//在外部new B对象调用private方法,失败 }}class B extends A{ private function say() { echo 'B-say'; }}$b = new B();$b->run();//结果:PHP Fatal error
独自の run メソッドが必要な場合は、それを書き直す必要があります。
<?phpclass A{ public function run() { var_dump($this); $this->say(); }}class B extends A{ public function run() { $this->say(); } private function say() { echo 'B-say'; }}$b = new B();$b->run();//结果:B-say
クリックして QR コードを生成
この記事は Cheng Xiaobai によって作成されましたこの記事は自由に複製および引用できますが、著者の署名と記事の出典の明示が必要です。