PHP
167
どのような問題がありますか?

この記事は最終更新日から5年以上が経過しています。

投稿日

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

はじめに

インターフェイスと、抽象クラスの差がイマイチわからないです。
間違った解釈の場合コメントください。

インターフェイス

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

<?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つしか継承できない。
  • インターフェイスは、実装のあるメソッドを持つことができないが、抽象クラスは、実装のあるメソッドを持つことができる。

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

◎抽象クラス

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

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

◎インターフェイス

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

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

終わり

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
nogson
へっぽこデザイナーです。
この記事は以下の記事からリンクされています
yamashikenデザインパターン感想からリンク

コメント

抽象クラスについて、色々記事を見ましたがダントツで分かり易かったです。有難う御座います。

3
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
新人プログラマ応援 - みんなで新人を育てよう!
~
データに関する記事を書こう!
~
167
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー