Posted at

PHPでインターフェイスと抽象クラスを使う

More than 3 years have passed since last update.


はじめに

インターフェイスと、抽象クラスの差がイマイチわからないです。

間違った解釈の場合コメントください。


インターフェイス

クラスが実装する必要があるメソッドの種類を、メソッドの実体を定義することなく作成することができます。

<?php

interface IShowName {
public function showName();
}

interface IShowAge {
public function showAge();
}

class User implements IShowName, IShowAge{

public function showName(){
echo 'SATO';
}

public function showAge(){
echo '55';
}
}

?>


インターフェイスの定義方法

インターフェイスを定義するには、interfaceを使用します。


  • インターフェイスで定義できるのは、実装を持たない抽象メソッドのみ

  • アクセス修飾子はpublicのみ

  • 定数を持つことができますが、実装先のクラスでオーバーライドすることはできません。

interface インターフェイス名 {

const 変数名 = 'ABC';
public function メソッド名();
}


インターフェイスの実装方法

インターフェイスは、implementsキーワードを使用して実装します。

インターフェイスは,で区切れば複数指定することができます。

class クラス名 implements インターフェイス名,インターフェイス名


インターフェイスで宣言されたメソッドは必ず、実装しなくてはいけない

インターフェイス内で定義しているメソッドは、class内でオーバーライドしないとエラーになります。

<?php

interface IShowName {
public function showName();
}

interface IShowAge {
public function showAge();
}

class User implements IShowName, IShowAge{
}

?>

//エラーが発生
//Fatal error: Class User contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods

インターフェイスで定義した定数を、実装先のクラスでオーバーライドした場合エラーとなります。

interface IShowName {

const name = 'KATO';
}

class User implements IShowName{
const name = 'SATO';

}

//Fatal error: Cannot inherit previously-inherited or override constant name from interface IShowName


抽象クラス

抽象クラスとは、他のクラスで継承してもらうことを前提としたクラス。

抽象クラス自体をインスタンス化することはできません。

<?php

abstract class BaseUser{
public $name;
abstract public function showName();
}

class User extends BaseUser{
public function showName(){
echo 'SATO';
}
}

?>


抽象クラスの定義方法

抽象クラスは、abstractキーワードを使用します。

abstract 抽象クラス名{

}


抽象メソッドの定義

抽象クラスは、抽象メソッドを定義できます。

定義するには、抽象クラス作成時と同じくabstractキーワードを使用します。


  • アクセス修飾子にはpublicprotectedが使用できます。

abstract 抽象クラス名{

abstract public function showName();
}


抽象クラスの継承方法

抽象クラスは、通常のクラス同様extendsキーワードを使用して継承します。

抽象クラス内で定義している、抽象メソッドは、必ず継承先でオーバーライドする必要があります。

オーバーライドしていない場合エラーとなります。

また、extendsで継承する為複数の抽象クラスを継承することはできません。

<?php

abstract class BaseUser{
public $name;
abstract public function showName();
}

class User extends BaseUser{
}

?>

//エラーが発生
//Fatal error: Class User contains 1 abstract method and must therefore be declared abstract or implement the remaining methods

抽象クラスは、通常のクラス同様、プロパティやメソッドを実装できます。

<?php

abstract class BaseUser{
//通常のクラス同様、プロパティやメソッドを定義
public $age = 55;
public function showAge($age){
echo $age;
}
//抽象メソッド
abstract public function showName();
}

class User extends BaseUser{

function __construct(){
$this->showName();
$this->showAge($this->age);
}

public function showName(){
echo 'SATO ';
}
}

$user = new User();//SATO 55

?>


インターフェイスと、抽象クラスの違い


  • インターフェイスは、クラスに複数実装できるが、抽象クラスは1つしか継承できない。

  • インターフェイスは、実装のあるメソッドを持つことができないが、抽象クラスは、実装のあるメソッドを持つことができる。


インターフェイスと、抽象クラスの使い分け


◎抽象クラス


抽象クラスは、複数のクラスの、共通処理の中に、一部違う処理が入る場合などに使用する。

アイドルに、「歌う、踊る、ファンと触れ合う」、という機能があるとして「ファンと触れ合う」はアイドルによって、ふれあい方が違うから、それぞれ実装したい場合などに使うみたい。


◎インターフェイス


不特定のクラスで、共通のメソッドを定義したい場合。

インターフェイスは、クラスで使用できるメソッドを保証しているので、クラスの使用書的な意味合いがありるみたいです。


終わり

ある程度の規模のアプリケーションや、複数人での開発をしないと抽象クラスも、インターフェイスも有り難みがわからないのかもしれません。