のぐそんブログ

暗いおじさんがシコシコ書くブログです。

PHPの抽象クラスとインターフェイスのメモ

抽象クラスとインターフェイスのメモです。

抽象クラス

抽象クラスを継承した、サブクラスは継承クラスのabstractキーワードをつけたメソッドを必ず実装(オーバーライド)しなければならない。 通常のクラスと同様に、abstractをつけずに普通のメソッドやプロパティも定義することができます。

抽象クラスは直接インスタンスを作ることはできません。 アクセス修飾子はpublicprotectedを利用することができます。

抽象クラス

<?php

abstract class AbstractClass
{
    abstract public function hoge();
}

サブクラス

<?php

require_once 'AbstractClass.php';

class MyClass extends AbstractClass
{
    public function hoge()
    {
        echo 'hoge';
    }
}

実行する

<?php
require_once 'MyClass.php';

$my_class = new MyClass(); 
$my_class->hoge(); //hoge

インターフェイス

インターフェイスを定義するにはinterfaceキーワードを利用します。

使う側は、implementsキーワードを利用します。 インターフェイスに宣言したメソッドは必ず実装しなければいけません。

インターフェイスのメソッドはpubulicでなければいけません。 定数を定義できるが、実装側でオーバーライドすることはできません。

インターフェイス

<?php

interface InterfaceIfc
{
    public function hoge();
}

インターフェイスを実装したクラス

<?php

require_once 'InterfaceIfc.php';

class MyClass implements InterfaceIfc
{
    public function hoge()
    {
        echo 'hoge';
    }
}

実行する。

<?php
require_once 'MyClass.php';

$my_class = new MyClass();
$my_class->hoge(); //hoge

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

インターフェイスは、クラスに対して複数定義することができる

<?php
  interface HogeIfc {
    public function hoge ();
  }

  interface FugaIfc {
    public function fuga ();
  }

  class ClassA implements HogeIfc, FugaIfc {
    public function hoge(){
     echo 'hoge';
    }
        
     public function fuga(){
      echo 'fuga';
    }
  }

◎抽象クラスは実装のあるメソッドを持つことができる

<?php

abstract class AbstractClass
{
    abstract public function hoge();
    
    public function fuga(){
        echo 'fuga';
    }
}

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

抽象クラスは

複数の派生クラスで一部実装が異なる場合に利用する。 「走る、歩く」という機能は同じだが、「踊る」というきのはそれぞれのクラスでことなる場合などに利用する。

インターフェイス

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