首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用class_implements与instanceof的有用性

使用class_implements与instanceof的有用性
EN

Stack Overflow用户
提问于 2013-07-16 03:40:29
回答 4查看 3.8K关注 0票数 7

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

代码语言:javascript
复制
if (in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
    // ...
}

我不明白为什么不使用instanceof

代码语言:javascript
复制
if ($var instanceof Doctrine\Common\Collections\Collection) {
    // ...
}

这在很多方面都更好。

这样做有什么实际的原因吗?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-24 10:47:06

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

instanceof上使用class_implements的一个原因是,您可以在作为类名称的字符串上使用class_implements

代码语言:javascript
复制
<?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
EN

Stack Overflow用户

发布于 2013-07-16 03:47:15

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

PHP Manual instanceof

PHP instanceof用于判断某个

变量是否为某个类的实例化对象:

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

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

PHP Manual class_implements

class_implements -返回由给定类

实现的接口

票数 6
EN

Stack Overflow用户

发布于 2013-07-16 03:46:33

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17662456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档