PHPで実行中にクラス名を取得する方法

こんにちは、さるまりんです。

クラスの継承関係があって実行中のクラスによって処理を分けたりするときにクラス名を取得することがあります。

それを今回はやってみます。

こんなクラスがあります。

namespace Experimental\Example;

abstract class SomeClass {
    // 略
}

class SomeOtherClass extends SomeClass {
    // 略
}

この中で実行中のクラス名を取得したいと思います。

PHPにはget_class()という関数があります。
この関数で引数で指定したオブジェクトのクラス名を取得できます。

クラス名を返却する関数を親クラスに実装してみます。

abstract class SomeClass {
    public function getClassName() {
        return get_class($this);
    }
}

これを利用してクラス名を表示するコードです。

$obj = new SomeOtherClass();
echo $obj->getClassName() . "\n";

実行結果はこんな風になります。

Experimental\Example\SomeOtherClass

namespaceも含めたクラス名が返却されているのがわかりますね。

シンプルなクラス名だけを取得したい場合はこうします。

public function getClassName() {
    return str_replace(__NAMESPACE__ . '\\', '', get_class($this));
}

str_replace()関数を使ってnamespaceの文字列(定数__NAMESPACE__) + \を空文字列に置き換えています。

実行結果です。

SomeOtherClass

これらのクラスがnamespaceに属していないときも同じ関数でクラス名を取得することができます。

ちなみにクラス名を取得するために、定数__CLASS__を使うと、コードが属するクラスの名前が取れて、親クラスでこんな実装をすると

public function getClassName() {
    return str_replace(__NAMESPACE__ . '\\', '', __CLASS__);
}

出力は

SomeClass

となります。

親クラスも中で子クラスによって処理を分けるというのがアリなのかナシなのかはおいておいて、こんなことをする必要がありましたのでここに残しておきます。
設計、プログラミング、面白いです。

読んでくださってありがとうござました。

それではまた!