LoginSignup
2
1

More than 3 years have passed since last update.

【PHP】マーカーインターフェイス

Last updated at Posted at 2021-03-07

はじめに

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();
}

上記の場合、AExceptionBExceptionの両方をキャッチしないといけません。

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する内容を明示的に表すことができるようになります!

おわりに

すぐに使いこなるテクニックではないですが、利用シーンが来たら見返していただけると幸いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1