変数を完全にスコープしない場合、これにはスコープの問題があります。
余分な入力を正当化するのに十分な問題は発生しないと言われることがありますが、DRYではありませんが、ColdFusionにはスコープ評価順序があるため、コンテキストに関係なく機能するコードがある場合に必要です。
以下の「クエリループ」とは、cfloop
または引数cfoutput
付きを意味します。query
したがって、クエリループ内で使用できます。#columnname#
クエリループの内側または外側にでき ます。#queryName.columnName#
あなたはすべての場合にすべきです。 #cfScope.queryName.columnName#
これがうまくいかない例です。このようなコードを処理する必要がないことを願っていますが、ColdFusionの広範なスコープ評価の問題を指摘するのに役立ちます。
<cfset testcfc = new Test().scopeTest()>
と
<cfcomponent output="false">
<cffunction name="scopeTest" access="public" output="true" returntype="void">
<cfargument name="Query" type="query" required="false" default="#QueryNew("xarguments")#">
<cfargument name="xlocal" type="string" required="false" default="This is not from a query; Arguments scope.">
<cfset QueryAddRow(Arguments.Query, 1)>
<cfset Arguments.Query["xarguments"][1] = "this is the arguments scope query">
<cfset local.Query = QueryNew("xlocal")>
<cfset QueryAddRow(local.Query, 1)>
<cfset local.Query["xlocal"][1] = "this is the local scope query">
<cfset Variables.Query = QueryNew("xVariables")>
<cfset QueryAddRow(Variables.Query, 1)>
<cfset Variables.Query["xVariables"][1] = "this is the variables scope query">
<cfset local.xlocal = "This is not from a query; local scope.">
<cfloop query="Query">
<cfoutput>#xlocal#</cfoutput>
</cfloop>
<cfdump var="#Arguments#" label="Arguments">
<cfdump var="#local#" label="local">
<cfdump var="#variables#" label="Variables">
<cfabort>
</cffunction>
</cfcomponent>
出力の結果は次のとおりです。これはクエリからのものではありません。引数のスコープ。スコープ評価のドキュメントや他の人に信じてもらえることとは 反対です。
他の人が示唆しているように、出力行を変更して読み取ることができます<cfoutput>#Query.xlocal#</cfoutput>
が、それも役に立ちません。代わりに、列が存在しないと言われます。に変更すると、またはの代わりにのバージョンを<cfoutput>#Query.xarguments#</cfoutput>
使用していたことが示されます。Arguments
Query
local
Variables
では、どうでしょうか。
<cfloop query="local.Query">
<cfoutput>#xlocal#</cfoutput>
</cfloop>
いいえ。それでも望ましい結果ではありません。では、クエリ名を出力に追加してみませんか。
<cfloop query="local.Query">
<cfoutput>#Query.xlocal#</cfoutput>
</cfloop>
いいえ。それでも望ましい結果ではありません。正しい結果が得られることを確認したい場合は、すべてを完全にスコープする必要があります。
<cfloop query="local.Query">
<cfoutput>#local.Query.xlocal#</cfoutput>
</cfloop>
これは誰もがやりたいよりもはるかに多くのタイピングですが、コードに厄介なバグが潜んでいないことを確認したい場合に必要です。