LoginSignup
16
4

More than 5 years have passed since last update.

PHP: なぜ !$value instanceof ClassName という書き方が問題なく動くのか?

Posted at

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

しかし、上記の評価順の認識は誤りで、実際は$dateDateTimeのインスタンスでないときだけfalseを返す。つまり、not instanceofとしての期待通りの評価になる。

こうした誤認は、instanceof演算子と他の演算子(例えば比較演算子の===など)と評価の優先度が同じだと勘違いしているときに起こりうる。例えば、!$a === $b!($a === $b)と同じでないが、!$a instanceof $b!($a instanceof $b)と同じである。

PHP7.2の演算子の優先順位では、instanceofは第5位で、は第6位であるから、instanceofよりも先に評価される。

PHP__演算子の優先順位_-_Manual.png

一方で、===の優先順位はよりもずっと後であるから、が評価された後に、===が評価されるわけだ。

$n = 5; $m = 5;
!$n === $m
((!$n) === $m)
(false === $m)
(false)
false

参考文献

PHP: 演算子の優先順位 - Manual

16
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
4