zawatech

【PHP】オブジェクト指向を完全に理解した話【後編】

タグ
オブジェクト指向
カテゴリ
PHP
Xこの記事をポストする
この記事をLINEでシェア

前回の続きです。

私は、どんな良質な記事でも長い記事になると途中でダレてきて読むのをやめちゃう時があります…

なので適度な長さに分けて今回は後編として、オブジェクト指向についてまとめてみました。

さて、本題に入りまして…

前回はプロパティ/メソッド、継承、コンストラクタについてまとめました。

今回はinterfaceとabstractについてまとめたいと思います。

interface

オブジェクト指向にはinterfaceという概念があります。

これは何か複数のものを作るときに、共通の機能を定めておき、それを流用しようという概念です。

またまた今回もガンダムで例えると、

全ての機体は『自分の機体名と所属チームを言う』という機能を持っているとします。

すると↓のようにコード化することができます。

<?php
interface Speak {
  public function myName();
  public function myTeam();
}
class Zaku implements Speak {
  public function myName() {
    echo 'ザク';
  }
  public function myTeam() {
    echo 'ジオン軍';
  }
}

ザクという期待はSpeakという機能を持ちます。

するとimplementsでinterfaceを流用し、ザクのクラス内で『自分の機体名をいう機能』と『自分の所属名をいう機能』の内容を記述します。

ここで注意しなければならないのがinterface宣言中では機能の詳細は書けない、ということです。

interface Speak {
  public function myName() {  // そもそも構文エラーで怒られる
    echo 'これは機体名です';
  }
  public function myTeam();   // これはOK
}

あくまでinterfaceは、『共通の機能は何を持つか』だけしか定義できません。

また、もう1点注意が必要なのが、interface内で定義したメソッドはimplements先で必ず記述しなければならないです。

class Zaku implements Speak {
  public function myName() {
    echo 'ザク';
  }
}                                   // myTeam()がない!!

↑ではZakuクラス内でmyTeam()メソッドを記述していないので怒られてしまいます。

abstract

interfaceと似たようなもので、abstractというものもあります。

<?php
abstract class MobileSuit {
  abstract public function myName();
  abstract public function myTeam();
}
class Zaku extends MobileSuit {
  public function myName() {
    echo 'ザク';
  }
  public function myTeam() {
    echo 'ジオン軍';
  }
}

このようにabstract [クラス名] {} と記述し、abstractクラスの中のプロパティ/メソッドもabstractをつけなければいけません。

継承はextendsで行い、使い方は前回の継承と同じです。

また、アブストラクトもインターフェースと同じで、宣言したものは継承先で必ず内容を記述しなければいけません。

<?php
abstract class MobileSuit {
  abstract public function myName();
  abstract public function myTeam();
}
class Zaku extends MobileSuit {
  public function myName() {
    echo 'ザク';
  }
}                                    // myTeam()がないので怒られる

interfaceとabstractの違い

しかし決定的に違うのは、アブストラクトはクラス継承の一環でしかないことです。

イメージとしては、Speakという喋る機能をガンダムやザクなど付けたい場合はインターフェースを使います。

また、ザクやガンダムはモビルスーツという似たような機体構造のものですが、ホワイトベース(戦艦)という全く違う構造のものに機能を追加したいときにも使えます。

一方、アブストラクトはモビルスーツというabstract(概要)があって、モビルスーツは最低限こんなパーツや動作があるから、これらをクラス継承してザクやガンダムを作ってね、というイメージです。

モビルスーツというアブストラクトを使って、ホワイトベース(戦艦)のクラスは作れません。構造が違いますからね。

まとめ

今回は、インターフェースとアブストラクトについてまとめました。

この、interfaceとabstractの違いが理解できればオブジェクト指向は完全に理解したと言って良いのではないでしょうか。

私もこの記事を書いている途中までよく理解してませんでしたからね…

Xこの記事をポストする
この記事をLINEでシェア
zawa1205

zawa1205

Qiita
GitHub
mail

webフロントエンドエンジニア