使用class_implements VS instanceof的用处

时间:2013-07-15 19:40:29

标签: php optimization doctrine-orm

在Doctrine的源代码中,如果偶然发现以下测试:

if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
    // ...
}

我不明白为什么不使用instanceof代替:

if ($var instanceof Doctrine\Common\Collections\Collection) {
    // ...
}

在许多方面都更好。

这样做有没有明显的理由?

也许表演?但实际上,这里有什么真正的区别,在我看来它会像simple VS double quotes

4 个答案:

答案 0 :(得分:6)

根据定义,class_implements专指interfaces,其中instanceof指的是班级本身及其所有父母。在您提供的示例中,代码正在验证接口的实现,使用instanceof可能会导致不需要的结果。

来自PHP Manual instanceof

  

instanceof用于确定PHP变量是否为   某个类的实例化对象:

     

instanceof也可用于确定变量是否为   从父类继承的类的实例化对象:

     

最后,instanceof也可用于确定变量是否为   实现接口的类的实例化对象:

来自PHP Manual class_implements

  

class_implements - 返回由实现的接口   给定班级

答案 1 :(得分:2)

class_implements将返回由指定类实现的所有接口的数组。

使用class_implements而不是instanceof的一个原因是,您可以对字符串使用class_implements

<?php
interface HasTest {
    public function test();
}

class TestClass implements HasTest {
    public function test() {
        return 'This is a quick test';
    }
}

$test = array (
    'test' => 'TestClass'
);


// !! Using instanceof
var_dump($test['test'] instanceof HasTest);

// !! Using class_implements
var_dump(in_array('HasTest', class_implements($test['test'])));

/**
 * Output:
 *
 * bool(false)
 * bool(true)
 */


$class = new $test['test'];
var_dump($class instanceof HasTest);

/**
 * Output:
 * bool(true)
 */

答案 2 :(得分:1)

他们似乎都在做同样的事情。但他们真的不是。使用class_implements的一个原因可能是检查类是否实现了某个接口。使用instanceof时,您不知道该类是接口还是仅仅是类。

答案 3 :(得分:0)

如果父类实现了接口,

instanceof将返回false。但是class_implements将返回父级的已实现接口。