抽象クラスを作成する場合はクラス名の前にabstractキーワードを記載します。
また、抽象メソッドを作成する場合はメソッド名の前にabstractキーワードを記載します。
abstractメソッドは処理を書くことができません。
<?php
/**
* コーヒーの抽象クラス
*
*/
abstract class AbstractCoffee
{
/**
* コーヒーを作成
*
* @return void
*/
abstract public function make(): void;
}
抽象クラスを継承したクラスは全ての抽象メソッドをオーバーライドする必要があります。
処理の内容は子クラスに一任されます。
<?php
/**
* 砂糖入りコーヒー
*
*/
class SugarCoffee extends AbstractCoffee
{
/**
* @inheritdoc
*/
public function make(): void
{
echo '砂糖入りコーヒー' . PHP_EOL;
}
}
<?php
/**
* ブラックコーヒー
*
*/
class BlackCoffee extends AbstractCoffee
{
/**
* @inheritdoc
*/
public function make(): void
{
echo 'ブラックコーヒー' . PHP_EOL;
}
}
<?php
/**
* カフェオレ
*
*/
class CafeAuLait extends AbstractCoffee
{
/**
* @inheritdoc
*/
public function make(): void
{
echo 'カフェオレ' . PHP_EOL;
}
}
仮引数の型指定で抽象クラスを指定することができます。
型指定に抽象クラスを指定した場合は、抽象クラスを継承したクラスを指定できます。
ただし、抽象クラスを型指定した場合は抽象クラスに定義しているメソッドのみ使用が可能です。
子クラスで新たに作成したメソッドは使用できません。
抽象クラスを仮引数に指定することで条件分岐を書く必要がなくなります。
さらに、コーヒーの種類が増やしたい場合はmakeCoffee関数のロジックに手を加えずに新しいクラスを作成すれば良いだけです。
<?php
/**
* コーヒーを作成
*
* @param AbstractCoffee $coffee 抽象コーヒークラスを継承したクラス
* @return void
*/
function makeCoffee(AbstractCoffee $coffee): void
{
$coffee->make();
}
makeCoffee(new SugarCoffee());
makeCoffee(new BlackCoffee());
makeCoffee(new CafeAuLait());
/*
* 実行結果
*
* 砂糖入りコーヒー
* ブラックコーヒー
* カフェオレ
*/