はじめに
phpでオブジェクト指向プログラミングを学んでいる初学者です。interfaceについてまとめてみました。(備忘録)
interface基本ルール
・インターフェイスをimplements(実装)したクラスは、class <クラス名> implements <インターフェイス名>
となる。
・インターフェイスで定義されたメソッドは必ず書かなくてはならない。
・インターフェイス内に処理は書けない。
・インターフェイスを複数implements(実装)することができる。
・インターフェイスはクラスではないため、インスタンス化ができない。
interface RockPaperScissors
{
//インターフェイスでは、実装を伴うメソッドやプロパティの宣言はできない
public function rock();
public function paper();
public function scissors();
}
class Battle implements RockPaperScissors
{
public function rock()
{
echo 'グー';
}
public function paper()
{
echo 'パー';
}
public function scissors()
{
echo 'チョキ';
}
}
$battle = new Battle();
$battle->rock(); //グー
$battle->paper(); //パー
$battle->scissors(); //チョキ
インターフェイスをimplements(実装)したクラスに、インターフェイスで宣言したメソッドを書かなかった場合
public function scissors()
をコメントアウトすると、
interface RockPaperScissors
{
public function rock();
public function paper();
public function scissors();
}
class Battle implements RockPaperScissors
{
public function rock()
{
echo 'グー';
}
public function paper()
{
echo 'パー';
}
//public function scissors()
//{
// echo 'チョキ';
//}
}
$battle = new Battle();
$battle->rock(); //グー
$battle->paper(); //パー
$battle->scissors(); //エラー!!!
Fatal error: Class Product contains 1 abstract method and must therefore be declared abstract or implement the remaining methods ...
インターフェイスで宣言したメソッドを書かなかったため(コメントアウト)、エラーが発生。。
extendsとimplementsでクラスとインターフェイスの併用もできる
例えば、class <クラス名> extends <親クラス名> implements <インターフェイス名>
のような記述が可能。
interface RockPaperScissors
{
public function rock();
}
class Fake
{
public function fakeAction()
{
echo '出さない';
}
}
class Battle extends Fake implements RockPaperScissors
{
public function rock()
{
echo 'グー';
}
}
$battle = new Battle();
$battle->rock(); //グー
$battle->fakeAction(); //出さない