インターフェイスを作成する場合はインターフェイス名の前にinterfaceキーワードを記載します。
インターフェイスには定数またはメソッド名を定義することができます。
一方、プロパティを定義することはできません。
また、メソッドの処理を記述することもできません。
インターフェイス同士であれば継承を利用することが可能です。
<?php
/**
* ビームインターフェイス
* このインターフェイスを実装するクラスはビームを撃つことができる
*
*/
interface BeamInterface
{
/**
* ビーム発射
*
* @return void
*/
public function fire(): void;
}
インターフェイスを実装する場合はクラス名の後にimplementsキーワードを書き、その後にインターフェイス名を指定します。
複数のインターフェイスを実装する場合はカンマ(,)で区切る必要があります。
インターフェイスを実装するクラスはインターフェイスで定義されている全てのメソッドを実装する必要があります。
処理の内容は実装クラスに一任されます。
<?php
/**
* 車クラス
*
*/
class Car implements BeamInterface
{
/**
* ビーム発射
*
* @return void
*/
public function fire(): void
{
echo 'ズームッ!!!' . PHP_EOL;
}
}
<?php
/**
* ミラクルソード
*
*/
class MiracleSword implements BeamInterface
{
/**
* ビーム発射
*
* @return void
*/
public function fire(): void
{
echo 'ズィンッ' . PHP_EOL;
}
}
<?php
/**
* 転生勇者
*
*/
class ReincarnatedHero implements BeamInterface
{
/**
* ビーム発射
*
* @return void
*/
public function fire(): void
{
echo '光を纏い、宇宙の闇を裂き、我が力を解き放て!レーザービーム!' . PHP_EOL;
}
}
仮引数の型指定でインターフェイスを指定することができます。
型指定にインターフェイスを指定した場合は、インターフェイスを実装したクラスを指定できます。
ただし、インターフェイスを型指定した場合はインターフェイスに定義されているメソッドのみ使用が可能です。
インターフェイスを仮引数に指定することで条件分岐を書く必要がなくなります。
ビームを撃てるクラスを増やしたい場合はfireBeam関数のロジックに手を加えずに新しいクラスを作成すれば良いだけです。
<?php
/**
* ビームを発射
*
* @param BeamInterface $iBeam ビームインターフェイスを実装したクラス
* @return void
*/
function fireBeam(BeamInterface $iBeam): void
{
$iBeam->fire();
}
fireBeam(new Car());
fireBeam(new MiracleSword());
fireBeam(new ReincarnatedHero());
/*
* 実行結果
*
* ズームッ!!!
* ズィンッ
* 光を纏い、宇宙の闇を裂き、我が力を解き放て!レーザービーム!
*/