173

クラス インスタンスが与えられた場合、それが特定のインターフェイスを実装しているかどうかを判断できますか? 私の知る限り、これを直接行う組み込み関数はありません。どのようなオプションがありますか (ある場合)?

4

6 に答える 6

290
interface IInterface
{
}

class TheClass implements IInterface
{
}

$cls = new TheClass();
if ($cls instanceof IInterface) {
    echo "yes";
}

「instanceof」演算子を使用できます。これを使用するには、左側のオペランドはクラス インスタンスで、右側のオペランドはインターフェイスです。オブジェクトが特定のインターフェイスを実装している場合は true を返します。

于 2008-11-08T04:27:41.273 に答える
119

ここ指摘されているように、を使用できます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);
}

これらのテストは、この単純なコードに基づいています。

于 2012-08-20T01:38:40.043 に答える
57

instanceofnlaqは、オブジェクトがインターフェイスを実装するクラスのインスタンスであるかどうかをテストするために使用できることを指摘しています。

しかしinstanceof、クラス型とインターフェースを区別しません。オブジェクトがたまたま呼び出されたクラスであるかどうかはわかりませんIInterface

PHP でリフレクション API を使用して、これをより具体的にテストすることもできます。

$class = new ReflectionClass('TheClass');
if ($class->implementsInterface('IInterface'))
{
  print "Yep!\n";
}

http://php.net/manual/en/book.reflection.phpを参照してください。

于 2008-11-08T07:00:31.030 に答える
25

将来の検索に役立つように、 is_subclass_ofも良いバリアントです (PHP 5.3.7+ 用):

if (is_subclass_of($my_class_instance, 'ISomeInterfaceName')){
    echo 'I can do it!';
}
于 2014-02-17T10:46:04.350 に答える