1. ホーム 
  2. 備忘録 
  3. PHP

インターフェイス

インターフェイスについて

インターフェイスを用いることで、メソッドの実装を定義せずに、子クラスに対して実装すべきメソッドを指定するコードが作成できる

クラスやトレイトと名前空間を共有するので、それらと同じ名前を使用することはできない

インターフェイスを作成するには class キーワードのかわりに interface を使用する

インターフェイスを利用するには extends キーワードのかわりに implements を使用する

また、クラスは1つしか継承できないが、インターフェイスは複数継承することができる

インターフェイス内で定義するメソッドは全て public である必要があり、また実装の中身を書くことはできない


インターフェイスには
・同じインターフェイスを実装することで、それを使用するコードに手を加えることなく、それらを交換することができる
・メソッドや関数が、インターフェイスを満たす引数を受け付け、操作できるようにする。
 中身の実装について利用者が気にする必要がなくなる。
といった役割がある


インターフェイスはマジックメソッドを宣言しても問題ない

/**
 * 図形用のインターフェイス
 */
interface Shape
{
  public function getShapeName();  // 図形の名称を返す.
  public function calcArea(); // 面積を求める.
}

/**
 * 正方形用のクラス
 */
class Square implements Shape
{
  private int $length;

  public function __construct( $length )
  {
    $this->length = $length;
  }

  public function getShapeName()
  {
    return '正方形';
  }

  public function calcArea()
  {
    return $this->length ** 2;
  }
}

/**
 * 矩形用のクラス
 */
class Rectangle implements Shape
{
  private int $width;
  private int $height;

  public function __construct( $width, $height )
  {
    $this->width = $width;
    $this->height = $height;
  }

  public function getShapeName()
  {
    return '矩形';
  }

  public function calcArea()
  {
    return $this->width * $this->height;
  }
}

/**
 * 図形に関するテスト処理
 *
 * @param Shape $shape
 * @return void
 */
function shapeTest( Shape $shape )
{
  // この $shape は Shape インターフェイスを継承したクラスである必要がある
  echo $shape->getShapeName();
  echo sprintf( '面積は %d です', $shape->calcArea() );
}

// 5 * 5 の正方形を作成
$shapeA = new Square( 5 );
shapeTest( $shapeA );
// 正方形
// 面積は 25 です

// 3 * 6 の矩形を作成
$shapeB = new Rectangle( 3, 6 );
shapeTest( $shapeB );
// 矩形
// 面積は 18 です

インターフェイスを継承する

インターフェイスを継承したインターフェイスを作成する場合は extends キーワードを使用できる


抽象クラスとの違い

抽象化のページにて同内容を記載しているのでこちらを参照


    参考文献

  1. 公式ドキュメント