インターフェイス
インターフェイスについて ▲
インターフェイスを用いることで、メソッドの実装を定義せずに、子クラスに対して実装すべきメソッドを指定するコードが作成できる
クラスやトレイトと名前空間を共有するので、それらと同じ名前を使用することはできない
インターフェイスを作成するには 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 キーワードを使用できる
抽象クラスとの違い ▲
抽象化のページにて同内容を記載しているのでこちらを参照
目次