89

如果实体是少数类但不是某些类的成员,我想执行一些功能。

有一个函数叫做instanceof.

但是有没有类似的东西

if ($entity !instanceof [User,Order,Product])
4

6 回答 6

158

给他们一个通用的接口,然后

if (!$entity instanceof ShopEntity)

或留在

if (!$entity instanceof User && !$entity instanceof Product && !$entity instanceof Order)

我会避免创建任意函数只是为了在一个地方保存一些字符。另一方面,如果您“过于频繁”地需要它,您可能存在设计缺陷?(在“太多边缘情况”之类的意思中)

于 2012-07-27T06:35:24.843 回答
77

PHP手册说: http: //php.net/manual/en/language.operators.type.php

!($a instanceof stdClass)

这只是一个逻辑和“语法”正确的书面语法。

!$class instanceof someClass

但是,上面建议的语法很棘手,因为我们没有具体说明哪个是否定的范围:变量本身或$class instanceof someclass. 我们在这里只需要依赖运算符的优先级[编辑,感谢@Kolyunya]。

于 2013-11-18T22:39:35.247 回答
13

PHP 运算符优先级

instanceof运算符就在否定之前,然后是这个表达式:

!$class instanceof someClass

在 PHP 中恰到好处,这正是您所期望的。

于 2013-12-04T12:10:30.203 回答
2

这个函数应该这样做:

function isInstanceOf($object, Array $classnames) {
    foreach($classnames as $classname) {
        if($object instanceof $classname){
            return true;
        }
    }
    return false;
}

所以你的代码是

if (!isInstanceOf($entity, array('User','Order','Product')));
于 2012-07-27T06:33:03.713 回答
0
function check($object) {
    $deciedClasses = [
        'UserNameSpace\User',
        'OrderNameSpace\Order',
        'ProductNameSpace\Product',
    ];

    return (!in_array(get_class($object), $allowedClasses));
}
于 2016-06-13T10:30:27.073 回答
0

或者你可以试试这些

    $cls = [GlobalNameSpace::class,\GlobalNameSpaceWithSlash::class,\Non\Global\Namespace::class];
    if(!in_array(get_class($instance), $cls)){
        //do anything
    }
于 2018-09-14T02:39:20.577 回答