こんにちは
最近筋トレを始めたこともあり、毎日どこかしらが筋肉痛状態のだーだいです。
phpでクラスについて学習していると出てくるextendsですが
「どうやって継承するのか分からない」
「別ファイルのクラスも継承できるの?」
「インスタンス化した後呼び出す方法は?」
など色々わからない点も多いのではないでしょうか。
本記事では、phpのextendsを使用してクラスを継承する方法を徹底解説します。extendsの使い方で戸惑っている方はぜひご確認ください。
目次
【php】クラスを継承するextendsのルール
phpのextendsを使用して継承したクラスを親クラスと呼び、親クラスを利用するクラスは子クラスやサブクラスと呼ばれています。
継承すると、親クラスのプロパティ・メソッド・コンストラクタを子クラスが引き継いで使用できます。
ただし、継承できるパターンは限られており、上記の3つにアクセス修飾子のprivateが指定されている場合、継承して利用できません。
privateは、同じクラス内のみ利用が可能という意味なので、継承して利用できないのです。
【php】参考コードを用いたextendsの記述例
phpでは、下記のようにextendsを使用してクラスを継承します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class A { public $test = ''; public function get() { return $this->test; } public function set(string $name) { $this->test = $name; } } class B extends A{ public function output() { return '子要素のoutputメソッド'; } } ?> |
Aが親クラスでBが子クラスになり、AとBの間にextendsを挟むことで継承できます。
継承すると、親クラスであるAに記述された$testプロパティやgetとsetメソッドが子クラスであるBクラスでも使用できるようになります。
phpのextendsを使ったクラスをインスタンス化する方法
継承したクラスをインスタンス化して、実際に引き継がれているのか見てみましょう。
参考コードと解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php class A { public $test = ''; public function get() { return $this->test; } public function set(string $name) { $this->test = $name; } } class B extends A{ public function output() { return '子要素のoutputメソッド'; } } $B = new B(); $B->set('親要素から追加したプロパティ'); echo "こちらは" . $B->get() . "です\n"; echo "こちらは" . $B->output() . "です"; ?> |
子要素であるBクラスをインスタンス化してsetメソッドの引数に文字を入力します。Bクラスではsetメソッドを定義していないので本来ならエラーになるのですが、継承すれば利用可能です。
1 2 |
$B = new B(); $B->set('親要素から追加したプロパティ'); |
getは子クラスでoutputは親クラスのメソッドになり、子クラスのインスタンスで両方のメソッドを呼び出しています。
1 2 |
echo "こちらは" . $B->get() . "です\n"; echo "こちらは" . $B->output() . "です"; |
参考コードの実行結果
コードの実行結果が下記のように表示されるので、無事親クラスを継承しているのがわかります。
require_onceを使用して別ファイルの親クラスを読み込もう
親クラスと子クラスが別々のファイルで定義されている場合は、他のファイル情報を読み込む「require_once()」という関数を使用します。
require_onceの引数に親クラスのパスを指定して子クラスに入力することで、別ファイルの親クラスを継承できます。
require_onceの入力方法は下記になります。
1 2 3 4 |
require_once("/parentFile.php"); class childClass extends parentClass{ } |
参考コードのように、require_onceは実行するコードよりも上に書きましょう。
【php】extendsで継承したクラスを書き直すオーバーライドとは
親要素と同じプロパティやメソッドを子要素で定義して、内容を書き換えることをオーバーライドといいます。親要素のメソッドの内容を変えて使いたいときに役立ちます。
オーバーライドの参考コードと解説
オーバーライドの方法はシンプルで、上書きしたい親クラスのメソッドを再度子クラスで定義するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php class A { public $test = ''; public function test() { return "親クラスです"; } } class B extends A{ public function test() { return "子クラスです"; } } $B = new B(); echo $B->test(); ?> |
親クラスに指定しているtestメソッドを子クラスでも定義して内容を変更しています。
コードに間違いがなければ、実行結果のように「子クラスです」と表示されます。
参考コードの実行結果
【インスタンス化できない?】抽象クラスの使い方
抽象クラスとは、親クラスとして継承されることを目的とした、インスタンス化できないクラスです。抽象クラスを使用するには、クラスの前に「abstract」を追加します。
1 2 3 4 5 6 7 8 9 10 |
abstract class A { public $test = ''; public function get() { return $this->test; } public function set(string $name) { $this->test = $name; } } |
abstractはクラスだけでなく、メソッドの前に追加して抽象メソッドを作ることも可能です。
1 2 3 |
abstract public function get() { return $this->test; } |
抽象メソッドが定義されているクラスの子クラスは、抽象メソッドをオーバーライドして使用する義務が生じます。抽象クラスをオーバーライドしないとエラーになります。
抽象クラスや抽象メソッドは複数人でプログラミングする際によく使用するので、本記事をきっかけに覚えておくとよいでしょう。
まとめ
いかがでしたか?
今回はphpでextendsを使用してクラスを継承する方法について解説しました。
phpでextendsを使用する際は、以下の3つの要点を押さえておきましょう。
- 親クラスのプロパティやメソッドに「private」が指定されていると継承しても使用できない。
- 別ファイルの親クラスを使用する場合、「require_once()」を使用する。
- 親クラスのプロパティとメソッドは、子クラスで再定義することで書き換えられる。
ぜひ試してみてくださいね。