はじめに
interfaceは実装しなくても、動くものを作ることができます。ただ、interfaceを定義することで、コードに縛りが出来き、保守性の高いプログラムができます。今日は、インターフェイスの一つ、マーカーインターフェイスを紹介します。
マーカーインターフェイスとは
オブジェクト指向プログラミングにおいて、メソッドやフィールドが一切定義されていないインタフェース。
Wikipedia
コード
マーカーインターフェイスを使わない例
php
class AException extends Exception {}
class BException extends Exception {}
try {
throw new AException('Aの例外処理');
} catch (AException $e) { // AExceptionをキャッチする
echo $e->getMessage();
} catch (BException $e) { // BExceptionをキャッチする
echo $e->getMessage();
}
上記の場合、AException
とBException
の両方をキャッチしないといけません。
php
class AException extends Exception {}
class BException extends Exception {}
try {
throw new BException('Bの例外処理'); // ←(1)
} catch (AException $e) { // AExceptionをキャッチする
echo $e->getMessage();
}
// Fatal error: Uncaught BException: Bの例外処理
(1)
でBのExceptionを投げているので、当然BExceptionをキャッチできず、エラーになります。
(ちなみに、catch (Exception $e)
にすれば動きますが、それではExceptionを拡張した意味がないです)
マーカーインターフェイスを使う例
php
// マーカーインターフェイス
// 関数もプロパティも定義しない
interface ABException {}
// ABExceptionを実装する
class AException extends Exception implements ABException {}
// ABExceptionを実装する
class BException extends Exception implements ABException {}
try {
throw new AException('Aの例外処理');
} catch (ABException $e) { // ABExceptionをキャッチできる!
echo $e->getMessage();
}
catch (ABException $e)
のようにABException
をキャッチすることができるようになり、catch
する内容を明示的に表すことができるようになります!
おわりに
すぐに使いこなるテクニックではないですが、利用シーンが来たら見返していただけると幸いです。