オブジェクト指向~抽象クラス~

PHPのシンタックス

  1. HOME
  2. OOP抽象クラス

オブジェクト指向~抽象クラス~

抽象クラスを定義する

抽象クラスは機能的にインターフェースと似ているが、抽象メソッドの宣言だけで機能を実装していないメソッドで、抽象クラスを継承した子クラスで必ずオーバーライドして機能を実装しなければなりません。
抽象メソッドにはpubloc、protected、priveteのアクセス権を指定することができます。

抽象クラス
abstract class 抽象クラス名 {
 abstract function 抽象メソッド名(引数,引数,...);
 //抽象クラスの実装
}

抽象クラスを継承して抽象メソッドを実装する

抽象クラスのインスタンスをつくることは出来ません。必ず継承して使います。
そして、継承した子クラスでは抽象メソッドを必ずオーバーライドして機能を実装しなければなりません。
アクセス権が設定されている場合は、子クラスでオーバライドの際に同じかそれより緩いアクセス権の設定が必要です。

抽象クラスを継承して、抽象メソッド実装
class クラス名 entends 抽象クラス名 {
 function 抽象メソッド名() {
//メソッドをオーバーライドして機能を定義する
}
 //子クラスの機能の実装
}

抽象メソッドthanks()をもった抽象クラス

<?php
abstract class Shop
{
  abstract function thanks(); //抽象メソッド

  protected $sales = 0;
  protected function sell($price){
    if(is_numeric($price)) { //引数が数値型の変数として有効な値である場合にTRUEを返す
      echo "{$price}円です。";
      $this->sales += $price;
    }
    $this->thanks(); //子クラスで実装されるメソッドを呼び出す
  }
}

抽象クラスを継承して抽象メソッドを実装する

<?php
require_once("Shop.php");

class MyShop extends Shop
{
  public function thanks() //抽象クラスで指定されているメソッド
  {
    echo "ありがとうございました。", "\n";
  }

  public function selling($tanka, $kosu) //販売する⇒抽象クラスから継承しているメソッドを実行
  {
    $price = $tanka * $kosu;
    $this->sell($price);
  }

  public function getSelling() //売上合計を出す
  {
    echo "売上合計は、{$this->sales}円です。";
  }
}

MyShopクラスのインスタンスを作って試す

9900円です。ありがとうございました。
3000円です。ありがとうございました。
売上合計は、12900円です。
<?php
require_once("MyShop.php");

$goods = new MyShop(); //インスタンスを作って試す
$goods->selling(3300, 3);
$goods->selling(600, 5);
$goods->getSelling();
?>