@ PHP

OOP:インターフェイス

インターフェイスとは、配下のメソッドがすべて抽象メソッドであるクラスのことです。

PHP では多重継承は許されておらず、複数のクラスを同時に継承することはできません。多重継承ができないということは、ポリモーフィズムを実現したいすべての機能(メソッド)をひとつの抽象クラスにまとめなければなりません。ということは、サブクラスが必ずしもその機能を必要としない場合にも「とりあえず」メソッドをオーバーライドしなければならないことになります。

そこで登場するのがインターフェイスです。インターフェイスでは「多重継承」が可能です。

インターフェスを定義するには、class 命令の代わりに interface 命令を使います。

format

interface インターフェイス名 {
    抽象メソッド;
    定数定義;
}

インターフェイスとクラスには以下のような違いがあります。

  • 定義できるのは抽象メソッドと定数のみです。(中身を持つメソッドやプロパティは定義できません。)
  • 配下のメソッドが抽象メソッドであることは明らかなので、abstract 修飾子は必要ありません。
  • アクセス修飾子も指定する必要がありません。
  • インターフェイスであることがわかるように、接頭辞・接尾辞を指定します。

インターフェイスの機能を受け継ぐことを実装するといいます。インターフェイスを実装したクラスのことを実装クラスと呼びます。

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

format

class 実装クラス名 implements インターフェイス名, ‥‥ {
    // クラスの本体
}

IWork ISkill 2 つのインターフェイスを実装した StaffInfo 実装クラスを定義してみます。

root
├── Person.php // スーパークラス
├── IWork.php // IWork インターフェイス
├── ISkill.php // ISkill インターフェイス
└── StaffInfo.php // 実装クラス

Person.php

<?php

class Person
{

    public $firstName;

    public $lastName;

    public function __construct($firstName, $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    public function show()
    {
        print "氏名:{$this->lastName}{$this->firstName}";
    }
}

IWork.php

<?php

interface IWork
{

    const PARTTIME = 0x01;

    const REGULAR = 0x02;

    const CONTRACT = 0x03;

    public function work($where);
}

ISkill.php

<?php

interface ISkill
{
    public function skill($language);

}

StaffInfo.php

<?php
require_once ('Person.php');
require_once ('IWork.php');
require_once ('ISkill.php');

class StaffInfo extends Person implements IWork, ISkill
{

    private $middleName;

    // スーパークラスのコンストラクタをオーバライド
    public function __construct(string $firstName, string $middleName, string $lastName)
    {
        // スーパークラスのコンストラクタの呼び出し
        parent::__construct($firstName, $lastName);
        $this->middleName = $middleName;
    }

    // show メソッドをオーバーライド
    public function show()
    {
        print "氏名:{$this->firstName}・{$this->middleName}・{$this->lastName}";
    }

    // work メソッドを実装
    public function work($where)
    {
        print "業務内容:プログラム({$where})";
    }

    // skill メソッドを実装
    public function skill($language)
    {
        print "スキル:{$language}";
    }
}

$si = new StaffInfo('太郎', 'クリスティアーノ', '山田');
$si->show();
print '<hr>';
$si->work('在宅勤務');
print '<br>';
print '雇用形態:' . Iwork::REGULAR;
print '<br>';
$si->skill('PHP');

PHP: オブジェクト インターフェイス – Manual

クラス/インターフェイス関連の関数
関数 戻り値
get_class([$obj]) オブジェクトの元となるクラス名
get_parent_class([$obj]) オブジェクトの元となるクラスの親クラス名
get_class_methods($class) クラスに属するメソッドの一覧($class はクラス名)
get_class_vars($class) クラスに属するプロパティの一覧($class はクラス名)