【PHP】純粋なクラス名のみ文字列で取得する

PHPで開発していると、クラス名を直接指定したい機会があります。
例えばLaravelであれば、ルートを設定する時に(クラス名)@(関数名) と指定します。

さて、
今回はクラス名を取得する方法についてご紹介します。

get_classの落とし穴

クラス名を取得する方法として用意されているのは、get_classです。
この関数を実行すると、クラス名を返してくれます。

www.php.net

しかし、ネームスペースが先頭に付与された状態で返します。
例えば次のようなクラスを用意して、get_class を実行するとネームスペース付きのクラス名が帰ってきます。

<?php
namespace Example

class Helper {
   //...
} 


echo get_class(new Helper());
// ネームスペース+クラス名が返ってくる
// Example/Helper

用途によってはこれで正しいかもしれませんが、ネームスペースを省略したクラス名を取得したい時には使えません。
上記例で言えば、Example/Helper ではなく、Helperのみ取得したい場合はどのようにするべきでしょうか?

ネームスペースを除いた純粋なクラス名を取得する

(私が確認する限り)純粋なクラス名を返す関数はありませんので、既存の関数を組み合わせてクラス名だけ取得する処理を作成します。

先程のget_classの難点はネームスペースを含んでしまう事でしたので、ネームスペースを空に置換して解決します。
次のような方法で実現できます。

<?php
namespace Example

class Helper {
   public static function getBaseClassName() {
        return str_replace(__NAMESPACE__ . '\\', '', get_class());
    }
} 

// 静的な関数ですので、インスタンスを作らずに呼び出す事が可能
echo Helper::getBaseClassName(); 
// Helper

これで解決できます。
この関数をそのままクラスに追加しても良いですし、もし複数のファイルで使いたい場合は継承元のクラスに追加しても良いかもしれません。

©︎2017-2018 WebSandBag