※前回の講座がまだの人はこちら
【PHP入門⑩】関数 ~初心者でも安心!基礎から学べるプログラミング講座~
継承
クラスを使えば同じ物を大量生産したり、色違い等の似たものを製造したり、機能を追加しやすくなると言いました。
機能の追加の中でも、バージョンアップしたり、大型アップデートをする場合を考えてみてください。
自転車クラスを使って、電動自転車を作るとします。「電動」という機能を追加するだけでなく、カラーバリエーションも充実させ、大量生産もしたいです。
自転車クラスをそのまま使うと、毎回インスタンス化した上で、電動機能を追加し、色を変える形になります。
電動機能は全ての自転車に共通の部分なので、共通化できたら楽だと思います。
そこで、自転車クラスの機能に電動機能をプラスした、電動自転車クラスを作れば、簡単にできます。
継承とは
電動自転車クラスは自転車クラスの機能を全て持っています。
もちろん、1から電動自転車クラスを作成しても良いですが、自転車クラスの内容を引き継ぐことで、簡単に作成することができます。
この様に、あるクラスを引き継いで新しいクラスを作成・拡張することを継承と言います。
また、継承元(自転車クラス)を親クラス、継承先(電動自転車クラス)を子クラスと言います。
継承の書き方
PHPの継承は以下の様に書きます。
class 子クラス extends 親クラス { メンバ変数; メンバ関数; }
この「子クラス extends 親クラス」と書くことで、子クラスは親クラスを継承することができます。
子クラスに親クラスの機能を追加するとイメージしてくれると良いです。
親クラス・子クラス
実際に親クラスと子クラスを作ってみます。
<?php //親クラス class Bicycle { public $color; public function turnRight(){ echo $this->color . '色の自転車が右へ曲がります。<br/>'; } } //子クラス class ElectricBicycle extends Bicycle{ public function assist(){ echo '走行補助をします。<br/>'; } }
Bicycleクラスを継承する、ElectricBicycleクラスを作成しました。
親クラスでも子クラスでも、クラスには変わりないので、インスタンス化することで、メンバ変数とメンバ関数を使うことができます。
また、子クラスには親クラスの機能が追加されているので、子クラスから作成したインスタンスでは、親クラスの変数と関数を扱うことができます。
//インスタンス作成 $bicycle01 = new ElectricBicycle(); $bicycle01->color = '黄'; $bicycle01->turnRight(); $bicycle01->assist();
<実行結果>
黄色の自転車が右へ曲がります。
走行補助をします。
親クラスの$color変数とturnRight()関数を使うことができました。
また、子クラス内でも親クラスの変数を使うことができます。
$color変数を子クラス内で使用したいので、子クラスを以下に修正して、実行してみます。
//子クラス class ElectricBicycle extends Bicycle{ public function assist(){ echo '自転車は' . $this->color . '色です。<br/>'; echo '走行補助をします。<br/>'; } }
<実行結果>
黄色の自転車が右へ曲がります。
自転車は黄色です。
走行補助をします。
オーバーライド
自転車クラスのturnRight()関数ですが、電動自転車クラスでは「○色の電動自転車が右へ曲がります。」と表示させたいはずです。
とはいえ、自転車クラスはそのまま残して、電動自転車クラスの方でturnRight()関数を作りたい時どうすれば良いでしょうか。
継承を使うと、親クラスで定義した変数や関数を子クラスで再定義することができます。
このことをオーバーライドと言います。
//子クラス class ElectricBicycle extends Bicycle{ public function turnRight(){ echo $this->color . '色の電動自転車が右へ曲がります。<br/>'; } } $bicycle01 = new ElectricBicycle(); $bicycle01->color = '黄'; $bicycle01->turnRight();
この様に関数を書くことで、親クラスのturnRight()関数ではなく、子クラスのturnRight()関数が実行されます。
<実行結果>
黄色の電動自転車が右へ曲がります。
他にも、親クラスの関数の処理にプラスで処理を実行したい場合でもオーバーライドは使えます。
//子クラス class ElectricBicycle extends Bicycle{ public function turnRight(){ parent::turnRight(); echo 'その自転車に電動自転車が付いて行きます。'; } } $bicycle01 = new ElectricBicycle(); $bicycle01->color = '黄'; $bicycle01->turnRight();
「parent::関数名」と書くことで、親クラスの関数が呼び出されます。(今回は、turnRight()関数)
<実行結果>
黄色の自転車が右へ曲がります。
その自転車に電動自転車が付いて行きます。
まとめ
クラスを扱う上で、継承はよく使われます。
今回の自転車の様に、クラスと関数を作って継承させて、色々プログラミングしてみてください。
プログラミングは書かなければ身につきません。
継承が使える様になれば、クラスが複数あるソースコードを読むことができます。