PHPでinstanceof
演算子は、変数がクラス(またはサブクラス)のインスタンスであればtrue
、そうでなければfalse
を返す。
$date = new DateTime();
assert($date instanceof DateTime);
assert(($date instanceof StdClass) === false);
PHPにはnot instanceof
のような逆の演算子は存在しない。そのため、論理演算子!
を組み合わせて使う:
!$date instanceof StdClass
この書き方は一見すると常にfalse
を返すように見える。なぜなら、次のように式が評価されると思われるからだ。
$date = new StdClass();
!$date instanceof DateTime
((!$date) instanceof DateTime)
(false instanceof DateTime)
(false)
false
しかし、上記の評価順の認識は誤りで、実際は$date
がDateTime
のインスタンスでないときだけfalse
を返す。つまり、not instanceof
としての期待通りの評価になる。
こうした誤認は、instanceof
演算子と他の演算子(例えば比較演算子の===
など)と評価の優先度が同じだと勘違いしているときに起こりうる。例えば、!$a === $b
は!($a === $b)
と同じでないが、!$a instanceof $b
は!($a instanceof $b)
と同じである。
PHP7.2の演算子の優先順位では、instanceof
は第5位で、!
は第6位であるから、instanceof
は!
よりも先に評価される。

一方で、===
の優先順位は!
よりもずっと後であるから、!
が評価された後に、===
が評価されるわけだ。
$n = 5; $m = 5;
!$n === $m
((!$n) === $m)
(false === $m)
(false)
false