1. ホーム
  2. php

[解決済み] オブジェクトの非限定(短い)クラス名を取得する方法を教えてください。

2022-04-21 22:24:45

質問

PHP の名前空間環境において、名前空間の完全なクラスを指定せずにオブジェクトのクラスを確認するにはどうしたらよいですか?

例えば、library/Entity/Contract/Name というオブジェクトがあったとします。

以下のコードは、get_class が完全な名前空間クラスを返すため、動作しません。

If(get_class($object) == 'Name') {
... do this ...
}

namespace magic キーワードは現在の名前空間を返しますが、テストされるオブジェクトが別の名前空間を持っている場合は役に立ちません。

単純にnamespacesでクラス名を完全に指定することもできますが、これではコードの構造が固定されてしまうようです。 また、名前空間を動的に変更したい場合にもあまり意味がない。

どなたか効率的な方法を考えていただけませんか。 一つの選択肢は正規表現だと思います。

どのように解決するのですか?

リフレクションを使えばいいんです。具体的には ReflectionClass::getShortName メソッドは、名前空間なしでクラスの名前を取得します。

まずは ReflectionClass インスタンスを作成し getShortName メソッドを呼び出すことができます。

$reflect = new ReflectionClass($object);
if ($reflect->getShortName() === 'Name') {
    // do this
}

しかし、これが望ましい状況というのはあまり想像できない。 オブジェクトが特定のクラスのメンバであることを要求したい場合、それをテストする方法として instanceof . もし、特定の制約をより柔軟に通知したいのであれば、その方法は、インターフェースを書いて、そのインターフェースの実装をコードに要求することです。繰り返しになりますが、これを行うための正しい方法は instanceof . (この方法は ReflectionClass しかし、それははるかに悪いパフォーマンスを持っています)。