オブジェクト指向~抽象クラス~
抽象クラスを定義する
抽象クラスは機能的にインターフェースと似ているが、抽象メソッドの宣言だけで機能を実装していないメソッドで、抽象クラスを継承した子クラスで必ずオーバーライドして機能を実装しなければなりません。
抽象メソッドにはpubloc、protected、priveteのアクセス権を指定することができます。
抽象クラス
abstract class 抽象クラス名 {
abstract function 抽象メソッド名(引数,引数,...);
//抽象クラスの実装
}
abstract class 抽象クラス名 {
abstract function 抽象メソッド名(引数,引数,...);
//抽象クラスの実装
}
抽象クラスを継承して抽象メソッドを実装する
抽象クラスのインスタンスをつくることは出来ません。必ず継承して使います。
そして、継承した子クラスでは抽象メソッドを必ずオーバーライドして機能を実装しなければなりません。
アクセス権が設定されている場合は、子クラスでオーバライドの際に同じかそれより緩いアクセス権の設定が必要です。
抽象クラスを継承して、抽象メソッド実装
class クラス名 entends 抽象クラス名 {
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();
?>