在Doctrine的源代码中,如果偶然发现以下测试:
if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
// ...
}
我不明白为什么不使用instanceof
代替:
if ($var instanceof Doctrine\Common\Collections\Collection) {
// ...
}
在许多方面都更好。
这样做有没有明显的理由?
也许表演?但实际上,这里有什么真正的区别,在我看来它会像simple VS double quotes。
答案 0 :(得分:6)
根据定义,class_implements
专指interfaces
,其中instanceof
指的是班级本身及其所有父母。在您提供的示例中,代码正在验证接口的实现,使用instanceof
可能会导致不需要的结果。
instanceof用于确定PHP变量是否为 某个类的实例化对象:
instanceof也可用于确定变量是否为 从父类继承的类的实例化对象:
最后,instanceof也可用于确定变量是否为 实现接口的类的实例化对象:
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将返回父级的已实现接口。