PHPでは、共有メソッドを持つクラスを作成し、サブクラスに継承させて対応する関数を取得することがよくあります。おおよそ次のような親クラスがあるとします:
<?php class Father{ public function construct(){ echo '我是父类的构造方法!'; } protected function say($str = 'Hello World!'){ echo '说了一句话:' . $str; } } ?>次に、それを継承するサブクラスを作成します:
<?php class chirld extends Father{ public construct(){ echo '我是子类的构造方法~'; } }この時点で、サブクラスをインスタンス化すると、結果は次のようになります。
I am theconstructor of the subclass~ ! <br>もちろん、<code>継承
関係により、サブクラスは親クラスの say()
メソッドを呼び出すことができます。 我是子类的构造方法~
!
当然,因为继承
关系,所以子类是可以调用父类的say()
方法的。
如果你想实现父类的构造方法,然而你又想实现子类的构造方法,你可以这样子去做:
<?php class chirld extends Father{ public construct(){ parent::construct(); echo '我是子类的构造方法~'; } } ?>
这时候就会输出我是父类的构造方法!
和我是子类的构造方法~
。
假设你在子类中定义了这么一个方法:
protected function say($str = ''){ echo '我是子类的say'; }
那么,你此时从父类继承下来的sys()
方法将会被重写,所以调用后输出的结果就是:我是子类的say
。
如果你这样定义会怎样?
public function say($str = ''){ echo '我是子类的方法哦~'; }
这样的写法还是可以的。PHP跟其他强类型语言不同的地方是,PHP重写方法允许你对重写的方法”向上公有化”,而不允许你”向下私有化”,就比如在这里你定义为private
是肯定会报错的,而像C++这样语言确恰恰相反。
PHP的对于这种情况的思想就是,你父亲给了你受保护级别的遗产,此时在你手上是保护级别的,你父亲允许你对对别人分享,也就是public
,但不允许你自己藏起来,也就是private
,自己独吞肯定不行的。
此时你肯定会问,那么父类的say()
设置为private
会怎样?
结果不会怎样,就是父类已经私有化了,子类根本继承不到,所以你在子类中的say()
方法随你这么定都可以。
还有一个问题,就是父类已经定义了sys()
中带可选参数,那么,在子类中的你像下面这样无参数定义会怎样呢?
public function say(){ echo '哈哈。我没有参数了耶~'; }
结果还是可以正常运行的,只不过会有 E_STRICT
親クラスのコンストラクターを実装したいが、サブクラスのコンストラクターも実装したい場合は、次のように実行できます:
私は親のコンストラクターですclass!
と 私はサブクラス~
のコンストラクターです。 🎜🎜サブクラスでそのようなメソッドを定義するとします: 🎜rrreee🎜その後、親クラスから継承した sys()
メソッドが書き換えられるため、呼び出し後の出力は次のようになります: 私はサブクラスの発言権です
。 🎜🎜このように定義するとどうなるでしょうか? 🎜rrreee🎜この書き方はまだ大丈夫です。 PHP と他の厳密に型指定された言語の違いは、PHP オーバーライド メソッドでは、オーバーライドされたメソッドを「上向きに公開」することはできますが、「下向きにプライベート化」することはできないことです。たとえば、ここでは として定義します。 private
は間違いなくエラーを報告しますが、C++ のような言語はまったく逆です。 🎜🎜この状況についての PHP の考え方は、あなたの父親があなたに保護レベルの継承を与えたということです。この時点では、あなたの父親はそれを他の人と共有することを許可しています。つまり、。 public
ですが、自分で隠すことはできません。つまり、private
を自分だけのものにすることはできません。 🎜🎜この時点で必ず疑問に思うでしょう、親クラスの say()
が private
に設定されている場合はどうなりますか? say()
メソッドを次のように決定できます。あなたが好きです。 🎜🎜もう一つ問題があります。それは、親クラスがすでにオプションのパラメータを備えた sys()
を定義しているため、次のようにパラメータなしでサブクラスで定義するとどうなるでしょうか。 🎜rrreee🎜結果は引き続き正常に実行できますが、E_STRICT
レベルのプロンプトが表示されます。その理由は、PHP の標準ではパラメータの数を親クラスに合わせる必要があるためです。もちろん、エラー レベルは php.ini で設定できます。 🎜以上がPHPクラスの継承使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。