とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

抽象クラスと抽象メソッドについて(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1における抽象クラスと抽象メソッドについて

<?php
declare(strict_types=1);


//cl1抽象クラスの定義
abstract class Cl1 {                           //Cl1抽象クラスの作成
  //プロパティの定義
  protected string $i1;
  //コンストラクターの抽象メソッド
  abstract public function __construct(string $i1, string $i2); //抽象メソッド
  //セッターの抽象メソッド
  abstract public function setCl2(string $i3); //抽象メソッド
  //i1プロパティのゲッター
  public function getI1(): string {            //i1プロパティのゲッター
    return $this->i1;                          //i1の値を返す
  }
}

class Cl2 extends Cl1 {                  //Cl1のサブクラス(Cl2)の作成
  //プロパティ
  private string $i2;
  //コンストラクター
  public function __construct(string $i1, string $i2) { //これがないとFatal Error
    $this->i1 = $i1;
    $this->i2 = $i2;
  }
  //セッター
  public function setCl2(string $i3) {   //これがないとFatal Error
    $this->i1 = $i3;
  }
  //ゲッター
  public function getI2(): string {      //この宣言部分をインターフェイスと同じにする
    return $this->i2;                    //処理の内容は自由
  }
}

$Cl1 = new Cl1();                        //抽象クラスはインスタンス化できない(Error)
$Cl2 = new Cl2('天空''ぺけ字拳');

echo $Cl2->getI1(), $Cl2->getI2(), "\n"//天空ぺけ字拳

抽象クラスとは、インターフェイスの機能を内包したインスタンス化できないクラスのことです。

抽象メソッドとは、インターフェイスや抽象クラスの中に定義できる継承クラスへのルール化のことです。

 

インターフェイスにはプロパティは定義できませんでした。

そしてインターフェイス内にメソッドをブレイス(波括弧)込みで定義することもできませんでした。

 

しかし抽象クラスでは、通常のクラスのようにプロパティの定義やブレイスを含めたメソッドの定義ができつつ、さらにインターフェイスのような抽象メソッドによる継承クラスへのルール強制ができるようになっています。

 

ただ抽象クラスは通常のクラスと違って、それをインスタンス化することはできません。

抽象クラス内に定義されたプロパティやメソッドを呼び出すには、その抽象クラスを継承したサブクラスのインスタンスを経由してアクセスする必要があります。

 

 

抽象クラスを作るには、通常のクラス宣言のclassの前に abstract と記述します。

抽象メソッドを作るときもこのルールと同じで、そのメソッドのアクセス修飾子の前に abstract と記述してやります。

 

なお当たり前ですが、抽象メソッドに宣言部分だけでなくブレイス以下の記述をすると、その時点で問答無用でErrorとなります。

 

 

以上です。