PHP では、クラスを作成し、そのクラス内で共通のメソッドを作成し、それをサブクラスに継承させて対応する関数を取得することがよくあります。おおよそ次のような親クラスがあるとします:
1 <?php 2 class Father{ 3 4 public function __construct(){ 5 echo '我是父类的构造方法!'; 6 } 7 8 protected function say($str = 'Hello World!'){ 9 echo '说了一句话:' . $str; 10 } 11 } 12 ?>
次に、それを継承するサブクラスを作成します:
1 <?php2 3 class chirld extends Father{ 4 5 public __construct(){ 6 echo '我是子类的构造方法~'; 7 } 8 }
この時点で、サブクラスをインスタンス化すると、結果として私がサブクラスのコンストラクターになります。 ~!
もちろん、継承関係により、サブクラスは親クラスのsay()メソッドを呼び出すことができます。
親クラスのコンストラクターを実装したいが、サブクラスのコンストラクターも実装したい場合は、次のように実行できます:
1 <?php 2 3 class chirld extends Father{ 4 5 public __construct(){ 6 parent::__construct(); 7 echo '我是子类的构造方法~'; 8 } 9 } 10 11 ?>
現時点では、私は親クラスのコンストラクターです! と出力されます。 サブクラスの構築方法です。
サブクラスでそのようなメソッドを定義するとします。
1 protected function say($str = ''){2 echo '我是子类的say'; 3 }
次に、親クラスから継承した sys() メソッドが書き換えられるため、呼び出し後の出力結果は次のようになります。
このように定義するとどうなるでしょうか?
れーれー
この書き方はまだ大丈夫です。 PHP と他の強く型付けされた言語の違いは、PHP のオーバーライド メソッドでは、オーバーライドされたメソッドを「上向きに公開」することはできますが、「下向きにプライベート化」することはできないことです。たとえば、ここでプライベートとして定義すると、次のようになります。間違いなくエラーが報告されますが、C++ のような言語ではまったく逆のことが行われます。
この状況についての PHP の考えは、現時点では、あなたの父親があなたに保護レベルの継承を与え、それを他の人と共有することを許可していますが、それは公開ではありません。それは自分で隠す、つまりプライベートなものであり、すべてを自分だけのものにすることは絶対にできません。
この時点で必ず疑問に思うでしょう、親クラスのsay() がプライベートに設定されている場合はどうなりますか?
結果は同じではありません。つまり、親クラスがプライベート化されており、サブクラスはそれをまったく継承できないため、サブクラスでsay()メソッドを必要に応じて使用できます。
もう 1 つ問題があります。つまり、親クラスが既にオプションのパラメーターを指定して sys() を定義しているため、次のようにパラメーターなしでサブクラスで定義するとどうなるでしょうか。
すごいです
結果はまだ正常に実行できますが、E_STRICT レベルのプロンプトが表示されます。その理由は、PHP の標準ではパラメータの数を親クラスに合わせる必要があるためです。もちろん、エラー レベルは php.ini で設定できます。
上記に誤りがある場合は、時間内に修正してください、ありがとうございます。