【PHP】一度の組み込み関数呼び出しでvar_dump()を二回呼び出す

  • 2019年6月17日
  • PHP

 多分たまたまC言語実装がそうなっているだけなのでしょうが、タイトル通りの現象が起きます。起きるのは次の通りArrayAccessを実装した際のemptyです。

 ArrayAccessの説明には次の様にあります。

ArrayAccess::offsetGet

(PHP 5, PHP 7)

ArrayAccess::offsetGetオフセットを取得する

説明

abstract public ArrayAccess::offsetGet
( mixed $offset
) : mixed

指定したオフセットの値を返します。

このメソッドは、オフセットが empty() かどうかを調べる際に実行されます。

ArrayAccess::offsetExists

(PHP 5, PHP 7)

ArrayAccess::offsetExistsオフセットが存在するかどうか

説明

abstract public ArrayAccess::offsetExists
( mixed $offset
) : bool

オフセットが存在するかどうかを返します。

このメソッドが実行されるのは、ArrayAccess
を実装したオブジェクト上で isset() あるいは
empty() を使用した場合です。

注意:

empty() を使用すると ArrayAccess::offsetGet()
がコールされ、ArrayAccess::offsetExists()
TRUE を返すかどうかで空かどうかを判断します。

 要するにemptyの真偽をArrayAccess::offsetExists && ArrayAccess::offsetGetという式で判断しています。このため最初の画像の様にArrayAccess::offsetExistsとArrayAccess::offsetGetにvar_dumpを仕込むとemptyと一度組み込み関数を使っただけで2か所のvar_dumpが走りました。
 ArrayAccess::offsetExists && ArrayAccess::offsetGetという表現から予想できるように短絡評価をしています。そもそもnullの場合はArrayAccess::offsetExistsのみを実行して終わりです。
 

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG