7

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

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

我不明白为什么不使用instanceof

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

这在很多方面都更好。

这样做有切实的理由吗?

也许是表演?但实际上,这里有什么真正的区别吗,在我看来,这就像简单的 VS 双引号

4

4 回答 4

6

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

来自PHP 手册 instanceof

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

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

最后,instanceof 也可以用来判断一个变量是否是一个实现了接口的类的实例化对象:

来自PHP 手册 class_implements

class_implements — 返回给定类实现的接口

于 2013-07-15T19:47:14.827 回答
2

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

使用class_implementsover的一个原因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)
 */
于 2015-06-24T02:47:06.350 回答
1

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

于 2013-07-15T19:46:33.290 回答
0

如果您的父类实现了接口,instanceof 将返回 false。但是 class_implements 将返回您父级的已实现接口。

于 2013-08-07T03:06:03.207 回答