PHPの継承について(extends,abstract編)


開発をする上で疎結合(そけつごう)なコードで書くことは重要です。
そこで、今回はphpの継承(抽象化)のextendsとabstractについて簡単にまとめようと思います。

簡単な図↓

1.クラスの継承 (extends)について

継承では、親クラスのメソッドを上書きすることができます。
継承する基のクラスをスーパークラス(もしくは親クラス)、継承して新たに作られるクラスをサブクラス(もしくは子クラス)と呼びます。

【構文】

class サブクラス名(子クラス) extends スーパークラス名(親クラス)
{
}

1.スーパークラス名の後にextends をつけて、継承させたいクラス名を書く
2.継承したクラスとメソッド(関数)の名前が重なっていたら、サブクラス側を優先する(上書き(オーバーライド))

例↓
 <?php
class Sports
 {
 //名前のプロパティ
 private $name = "";
 //名前のゲッタ
 public function getName(): string
 {
 return $this->name;
 }
 //名前のセッタ
 public function setName(string $name): void
 {
 $this->name = $name;
 }
}
//出力結果

<?php
 class Tennis extends Sports 
 {
 public function call(): string
 {
 return “ゲーム1";
 }
}
継承すると親のメンバーを全て引き継ぎます。

Phpファイル作成 

 <?php
 require_once("Sports.php");
 require_once("Tennis.php");
 $clubs = new Tennis(); 
 $clubs->setName(“テニス部"); 
 print($clubs->getName()."は".$clubs->call().”の試合をしています"); 
//出力結果
テニス部はゲーム1の試合をしています

注意点

PHPの継承では、親クラスとして指定できるのは1つだけであり、親クラスを複数指定できません。

上記のコードのように、実行部分で直接利用していないクラスでも、親クラスとして指定している場合は、そのクラスが記述されたファイルをrequire_onceで読み込んでおく必要があります。
また、順番は親クラスが先に読み込まれるようにしないといけません。

2.抽象クラス (abstract) 不要論について

抽象クラスは継承前提のクラスで、インスタンス化(new)はできません。

[決まりごと]
①継承クラスは abstract で始める
②functionの前にabstractをつけると、継承されたクラスで必ず指定する必要がある
(この場合、functionの中身は書かない)
③abstractなしの関数も書ける (こちらは継承クラスで使わなくても問題なし)

例↓

<?php


//抽象クラス 頭に abstractをつけて class指定
abstract class MusicClass{

  //頭にabstractをつけてメソッド(関数)を指定。この場合は中身をかいたらいけません。
  abstract public function Piano();

  public function Electone($str){
    echo $str.'抽象クラスです。';
  }
}

//親クラス extendsをつけて継承している
class InstrumentClass extends MusicClass{

  public function Piano(){
    echo 'Pianoは親クラスです';
  }

}

//インスタンスを生成
$instrument = new InstrumentClass();

//メソッドの呼出し
$instrument->Piano();
$instrument->Electone('Electoneは');

?>

ほとんど普通のクラスと変わらないですが、abstractをつけると使えるメソッドを絞ることができ、abstractをつけないとインスタンス化ができません。