クラス インスタンスが与えられた場合、それが特定のインターフェイスを実装しているかどうかを判断できますか? 私の知る限り、これを直接行う組み込み関数はありません。どのようなオプションがありますか (ある場合)?
6 に答える
interface IInterface
{
}
class TheClass implements IInterface
{
}
$cls = new TheClass();
if ($cls instanceof IInterface) {
echo "yes";
}
「instanceof」演算子を使用できます。これを使用するには、左側のオペランドはクラス インスタンスで、右側のオペランドはインターフェイスです。オブジェクトが特定のインターフェイスを実装している場合は true を返します。
ここで指摘されているように、を使用できますclass_implements()
。Reflectionの場合と同様に、これによりクラス名を文字列として指定でき、クラスのインスタンスは必要ありません。
interface IInterface
{
}
class TheClass implements IInterface
{
}
$interfaces = class_implements('TheClass');
if (isset($interfaces['IInterface'])) {
echo "Yes!";
}
class_implements()
SPL拡張の一部です。
参照: http: //php.net/manual/en/function.class-implements.php
パフォーマンステスト
いくつかの簡単なパフォーマンステストは、各アプローチのコストを示しています。
オブジェクトのインスタンスを指定します
ループ外のオブジェクト構築(100,000回の反復) ____________________________________________ | class_implements | リフレクション| instanceOf | | ------------------ | ------------ | ------------ | | 140ミリ秒| 290ミリ秒| 35ミリ秒| '--------------------------------------------' ループ内のオブジェクト構築(100,000回の反復) ____________________________________________ | class_implements | リフレクション| instanceOf | | ------------------ | ------------ | ------------ | | 182ミリ秒| 340ミリ秒| 83ミリ秒| 安いコンストラクター | 431ミリ秒| 607ミリ秒| 338ミリ秒| 高価なコンストラクター '--------------------------------------------'
クラス名のみを指定
100,000回の反復 ____________________________________________ | class_implements | リフレクション| instanceOf | | ------------------ | ------------ | ------------ | | 149ミリ秒| 295ミリ秒| 該当なし| '--------------------------------------------'
高価な__construct()は次のとおりです。
public function __construct() {
$tmp = array(
'foo' => 'bar',
'this' => 'that'
);
$in = in_array('those', $tmp);
}
これらのテストは、この単純なコードに基づいています。
instanceof
nlaqは、オブジェクトがインターフェイスを実装するクラスのインスタンスであるかどうかをテストするために使用できることを指摘しています。
しかしinstanceof
、クラス型とインターフェースを区別しません。オブジェクトがたまたま呼び出されたクラスであるかどうかはわかりませんIInterface
。
PHP でリフレクション API を使用して、これをより具体的にテストすることもできます。
$class = new ReflectionClass('TheClass');
if ($class->implementsInterface('IInterface'))
{
print "Yep!\n";
}
将来の検索に役立つように、 is_subclass_ofも良いバリアントです (PHP 5.3.7+ 用):
if (is_subclass_of($my_class_instance, 'ISomeInterfaceName')){
echo 'I can do it!';
}