Bir örneğinin sınıfı bir arabirimi uygulayan olmadığını denetleme?

4 Cevap php

Bir sınıf örneği göz önüne alındığında, bunun belirli bir arabirimi uygulayan olmadığını belirlemek mümkün mü? Bildiğim kadarıyla, doğrudan yapmak yerleşik bir fonksiyonu yoktur. Ben (varsa) ne gibi seçenekler var?

4 Cevap

interface IInterface
{
}

class TheClass implements IInterface
{
}

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

Sen "örneği" operatörünü kullanabilirsiniz. Bunu kullanmak için, sol işlenen bir sınıf örneği ve sağ işlenen bir arayüz. Nesnenin belirli bir arabirimi uygulayan eğer true döndürür.

Nelson LaQuet nesnesi bir arabirimi uygulayan bir sınıf örneği ise instanceof test etmek için kullanılan işaret.

Ama instanceof bir sınıf türü ve bir arayüz arasında ayrım yapmaz. Nesne class IInterface adı olur o olup olmadığını bilmiyorum.

Ayrıca özellikle bu test PHP yansıma API kullanabilirsiniz:

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

Bkz http://php.net/manual/en/book.reflection.php

therefromhere belirttiği gibi, kullanabilirsiniz class_implements(). Sadece Yansıma gibi, bu bir dize olarak sınıf adını belirtmek için izin verir ve sınıfının bir örneğini gerektirmez:

interface IInterface
{
}

class TheClass implements IInterface
{
}

$interfaces = class_implements('TheClass');

if (isset($interfaces['IInterface'])) {
    echo "Yes!";
}

class_implements() SPL uzantısı bir parçasıdır.

Bkz: http://php.net/manual/en/function.class-implements.php

Performance Tests

Bazı basit performans testleri, her yaklaşımın maliyetleri gösterir:

Given an instance of an object

Object construction outside the loop (100,000 iterations)
 ____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 140 ms           | 290 ms     | 35 ms      |
'--------------------------------------------'

Object construction inside the loop (100,000 iterations)
 ____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 182 ms           | 340 ms     | 83 ms      | Cheap Constructor
| 431 ms           | 607 ms     | 338 ms     | Expensive Constructor
'--------------------------------------------'

Given only a class name

100,000 iterations
 ____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 149 ms           | 295 ms     | N/A        |
'--------------------------------------------'

Nerede pahalı __ construct () 'dir:

public function __construct() {
    $tmp = array(
        'foo' => 'bar',
        'this' => 'that'
    );  

    $in = in_array('those', $tmp);
}

Bu testler, this simple code dayanmaktadır.

Sadece gelecek aramalar yardım etmek is_subclass_of (PHP 5.3.7 +) de iyi bir çeşididir:

if (is_subclass_of($my_class_instance, 'ISomeInterfaceName')){
    echo 'I can do something !';
}