浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

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

 多分たまたま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のみを実行して終わりです。
 

  • この記事いいね! (1)