Php 使用类_实现VS instanceof的有用性

Php 使用类_实现VS instanceof的有用性,php,optimization,doctrine-orm,Php,Optimization,Doctrine Orm,在条令的源代码中,如果偶然发现以下测试: if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) { // ... } 我不明白为什么不改为使用instanceof: if ($var instanceof Doctrine\Common\Collections\Collection) { // ... } 这在很多方面都更好 这样做有切实的理由吗 也许是表演?但真的,这里

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

if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
    // ...
}
我不明白为什么不改为使用
instanceof

if ($var instanceof Doctrine\Common\Collections\Collection) {
    // ...
}
这在很多方面都更好

这样做有切实的理由吗


也许是表演?但真的,这里有什么真正的区别吗?在我看来,这就像是。

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

根据定义,
class\u实现的
特别指接口,其中
instanceof
指类本身及其所有父类。在您提供的示例中,代码正在验证接口的实现,使用
instanceof
可能会导致不必要的结果

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

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

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

class_implements-返回由 给定类


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

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

使用
class\u implements
覆盖
instanceof
的一个原因是,您可以在作为类名称的字符串上使用
class\u 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)
 */

是的,但在那种情况下这很奇怪,因为
集合
是条令项目的接口,所以它没有理由成为一个类……你能再扩展一点吗?我不明白你的答案。我很确定情况正好相反:
instanceOf
对于父类也返回true。恐怕你的代码是非常错误的。请参阅:使用前面带有
new
的类名(即just
HasTest
)使PHP将其用作常量。由于它不存在,PHP将它转换为
“HasTest”
字符串。你说的我错得很对,我已经相应地更新了我的答案。啊哈,现在我明白你的意思了(这个小错误分散了我的注意力),谢谢你花时间更新!