PHP
abstract
interface
40
どのような問題がありますか?

投稿日

更新日

【PHP】interfaceとabstractの違い

自分用のアウトプットのために書きました。

interface

interfaceという英語の意味は「接点」や「境界面」といった意味で、ニュアンスでいうと「異なる2つのものを仲介する」といった感じ。

構文と使い方

構文
interface 名前
{
  public function 抽象メソッド名();
}

ちなみに、interfaceをクラスで使用するときは「継承」とは言わず「実装」って言うらしい。

使い方
interface LifeStyle
{
  //定数を定義できる
  const $feeling = happy;

  //実装を伴うメソッドやプロパティの定義はできない(抽象メソッド)
  public function breakfast();
  public function lunch();
  public function dinner();
  public function greeting($message);
}

//implementsで使用
class Taro implements LifeStyle 
{
  public function breakfast()
  {
    echo '食パン';
  }

  public function lunch()
  {
    echo 'うどん';
  }

  public function dinner()
  {
    echo 'お好み焼き';
  }

  public functino greeting($message)
  {
    echo $message;
  }
}

特徴

  1. 定数を定義できる
  2. アクセス修飾子はpublicのみ指定可能
  3. interfaceはクラスじゃないからインスタンス化できない
  4. クラスで使うときはimplementsでinterface名を指定する
  5. 実装を伴うメソッドやプロパティの定義はできない(抽象メソッドのみ)
  6. 1つのクラスに対し複数のinterfaceを実装できる(多重継承みたいなことができる)
  7. interfaceで定義したメソッドをクラス内で必ず使用(オーバーライド)しなければならない

個人的に便利だなと思うところは7番の部分。
もしinterfaceで定義してあるメソッドをクラス内で全て使わなかった場合はphpが停止するから早期エラー発見につながる。
しかも、interfaceの中で定義されているメソッドを覗くと継承元のクラスの仕様書みたいな使い方もできちゃう。

あ、ちなみに継承でおなじみextendsを使って、interfaceを継承してinterfaceを定義できるよ(ややこしい)。

interfaceの継承
interface Human
{
  public function speak();
}

interface Japanese extends Human
{
  public function eatNatto();
}

abstract

abstractは英語で「抽象的な」って意味。その意味の通りプログラミングの世界では「抽象クラス」って言われます(ちなみに英語で言う時もabstract classって言う)。

構文と使い方

構文
abstract class 抽象クラス名
{
    // 抽象メソッド
    abstract アクセス修飾子 function メソッド名();
}

抽象クラスは書き方がちょっとややこしいので説明をば。
抽象クラスは元をたどればクラスなので抽象メソッド(処理内容が書いてないメソッド)だけじゃなくて普通のメソッドやプロパティも定義できる。
abstractって最初に書けばそれは「抽象〜」って呼ばれる、って覚えとけばいい多分。

でも、下に書いたような「抽象プロパティ」だけは存在できない。仲間はずれ。

//これを抽象クラス内に書いたらエラー
abstract public $value;
//これは普通のプロパティなので抽象クラス内でもOK
public $value;

使い方はクラスの継承と一緒でextendsを使う。

使い方
abstract class Product
{
  abstract public function sell();
}

//クラスの継承のやり方と一緒
class FoodProduct extends Product
{
  public function sell()
  {
    echo `毎度ありがとうございます`;
  }
}

特徴

  1. アクセス修飾子は自由につけられる
  2. 抽象プロパティだけ抽象クラスの中で定義できない
  3. 抽象クラスはクラスだけど直接インスタンス化できない
  4. クラスで使うときは普通の継承のようにextendsを使う
  5. 普通のクラスみたいに中身があるメソッドやプロパティを定義できる
  6. 抽象クラスで「定義し、なおかつ未実装のメソッド」を継承したクラス内で必ず使用(オーバーライド)しなければならない

頭の良いみなさんならお気付きになるでしょう。「interfaceと一緒で定義したメソッドをクラス内で使わなきゃいけないんだったら、普通のメソッドもクラスに継承できる抽象クラスの方がいいんじゃね」と。

interfaceとabstract(抽象クラス)の違いって?

機能的な面からいえば、「普通のメソッドとプロパティを定義できるかどうか」。
ここだけ見れば「interfaceイラネ」ってなる。わかりますその気持ち。 interfaceの抽象メソッドはpublicだけだし変数は定数だけですしね。

使い方での違いってのはあるみたい。

interfaceは不特定のクラスで共通のメソッドを定義したいとき。
abstract(抽象クラス)は(普通のクラスを継承する立ち位置と似ていて)、共通処理の中に一部違う処理が入るとき。

って感じで。

参考

インターフェイス
PHPのinterfaceとabstractを正しく理解して使い分けたいぞー
PHPのinterfaceとは何か
Interface,Implementsを使う利点って何?【PHPのInterface】
PHP Interfaces and Abstract Classes(インターフェースと抽象クラス)

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

コメント

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

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

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