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)

一部の文字を 1 か所に保存するためだけに、任意の関数を作成することは避けます。反対に、「頻繁に」必要な場合は、設計上の欠陥がある可能性がありますか? (「エッジケースが多すぎる」などの意味で)

于 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 に答える