在Doctrine的源代码中,如果偶然发现了以下测试:
if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
// ...
}我不明白为什么不使用instanceof:
if ($var instanceof Doctrine\Common\Collections\Collection) {
// ...
}这在很多方面都更好。
这样做有什么实际的原因吗?
也许是表演?但真的,这里有什么真正的区别吗,在我看来,它就像simple VS double quotes。
发布于 2015-06-24 10:47:06
class_implements将返回由指定类实现的所有接口的数组。
在instanceof上使用class_implements的一个原因是,您可以在作为类名称的字符串上使用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)
*/发布于 2013-07-16 03:47:15
根据定义,class_implements专门指interfaces,而instanceof指的是类本身及其所有父类。在您提供的示例中,代码正在验证接口的实现,使用instanceof可能会导致不想要的结果。
从PHP Manual instanceof
PHP instanceof用于判断某个
变量是否为某个类的实例化对象:
instanceof还可用于确定变量是否为继承自父类的类的实例化对象:
最后,instanceof还可用于确定变量是否为实现接口的类的实例化对象:
从PHP Manual class_implements
class_implements -返回由给定类
实现的接口
发布于 2013-07-16 03:46:33
他们似乎都在做同样的事情。使用class_implements的一个原因可能是检查一个类是否实现了某个接口。在使用instanceof时,您不知道这个类是一个接口还是一个类。
https://stackoverflow.com/questions/17662456
复制相似问题