PHPサブクラスでの親クラスのプライベートメソッドのオーバーライドに関する質問

WBOY
リリース: 2016-06-20 12:29:30
オリジナル
1005 人が閲覧しました

<?php	class A{		private function test(){			echo "testA";		}	}	class B extends A{		public function test($a){			echo "testB".$a;		}	}		$var1=new B;	$var1->test(10);?>
ログイン後にコピー

上記のコードでは、
サブクラス B は A を継承しますが、A の test() は原則として継承すべきではありません。同じ名前でパラメータが異なる test() もエラーを報告します。これもオーバーロード エラーですか?


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

<?php	class A{		private function test(){			echo "testA";		}	}	class B extends A{		private function test($a){			echo "testB".$a;		}		public function test1($a){			$this->test($a);		}	}		$var1=new B;	$var1->test1(10);?>
ログイン後にコピー
ログイン後にコピー

B の public を private に変更しても、エラーは報告されません

エラー メッセージを見ても何が起こっているのかわかりませんか?

エラーメッセージを見ても何が起こっているのか分かりませんか?


エラーの原因が書き換えであることはわかっていますが、次の 2 つの質問があります:
1. 親クラスのプライベート メソッドが継承されていないのはなぜですか?
2. サブクラスの public と protected はエラーを報告するのに、private はエラーを報告しないのはなぜですか?
class B extends A{        public function test($a){            echo "testB".$a;        }}
ログイン後にコピー

説明してもらえますか?

書き換えではなく上書きです
上書きの条件は保護方法とパラメータが一致していることです
Javaから強制されるようなものは本来の意図に反します

C# ですら「動的言語」が登場しつつあり、php は徐々に静的になっていきます。これは一歩後退ではないでしょうか。

書き換えではなく上書きです
上書きの条件は保護方法とパラメータが一致していることです
Javaから強制されるこのようなことはphpの本来の意図に反します、そして最終的にはphpにつながります

の死 C#ですら「動的言語」が立ち上げられ、PHPは徐々に静的になってきているのではないでしょうか。


書き換えと上書きは同じ意味ではないでしょうか?
私が明確に表現していなかったかもしれませんが、私が言いたいのは、親クラスのプライベート test() メソッドは継承できないということです。理論的には、サブクラスに test() という名前の関数を作成して、パラメータリストも任意ですが、このコードはエラーを報告します。 では、継承できないメソッドもオーバーライドされるのでしょうか?
<?php    class A{        private function test(){            echo "testA";        }    }     class B extends A{        public function test($a){            echo "testB".$a;        }    }         $var1=new B;    $var1->test(10);?>
ログイン後にコピー

次のコードがサブクラス内にある場合、パラメータ リストが矛盾しているのはなぜですか?
<?php	class A{		private function test(){			echo "testA";		}	}	class B extends A{		private function test($a){			echo "testB".$a;		}		public function test1($a){			$this->test($a);		}	}		$var1=new B;	$var1->test1(10);?>
ログイン後にコピー
ログイン後にコピー

B::test が再定義される、または書き換えられる (上書きされる)
php ではオーバーロードがサポートされない

それについては、いわゆる構文チェックがすべてです

B::test は再定義または書き換え (上書き) です。
オーバーロードは php ではサポートされていません

いわゆる文法チェックに関しては、それらはすべてナンセンスで、php を強制的に遅くするために使用されます


つまり、B::test() は親クラスとは何の関係もありません。 ? ありがとう。

そうですね、そうです

B::test は再定義、または書き換え (上書き) です
php でのオーバーロードはサポートされていません

のようにいわゆる文法チェックはすべてナンセンスです。php


つまり、ここでは書き換えはなく、B で新しい関数 test() が定義されています。 。

ただし、フォームは書き換えられます

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!