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