ColdFusionで変数が定義されているかどうかを調べるには

ColdFusionで変数が定義されているかどうかを調べるにはisDefined()もしくはstructKeyExists()を使いますが、isDefined()には罠があるという話。元ネタはisDefined() vs structKeyExists()

isDefined('variable.name')とした場合、普通Variables.variable.name(Variablesスコープにあるvariableと言う名前の構造体の中にあるキーがnameの変数)を調べるものと思いこんでしまいますが、Variables['variable.name'](Variablesスコープにあるvariable.nameと言う名前の変数)があった場合にもYESを返してしまいます。つまり、以下の2つの変数それぞれが定義されているかどうかを区別することができません。

<cfset Variables['variable.name'] = 'val' />
<cfset Variables.variable.name = 'val' />

これをしっかり区別するためには、それぞれ、structKeyExists(Variables, 'variable.name')structKeyExists(Variables.variable, 'name')としましょうという話。

また、isDefined("foo")とした場合、Variablesスコープだけでなく、URLスコープなども検索されます。Variables.fooURL.fooのどちらかがあればYESを返してしまうので注意。

詰まるところ、ある変数が定義されているかどうかきちんと調べたい場合はstructKeyExists()を使いましょうと言うことです。

Leave a Reply

Your email address will not be published. Required fields are marked *