【发布时间】:2013-09-12 10:16:08
【问题描述】:
我想轻松地将参数的结构内容放入组件所有函数的变量范围内。 'Title' 是 searchitems 结构之一。
<cffunction name="setSearch" acces="public" returntype="void">
<cfargument name="searchitems" type="struct" required="true" />
<cfset variables = arguments.searchitems>
<cfset variables.test = "yo">
</cffunction>
<cffunction name="testit" acces="public" returntype="void">
<cfdump var="#variables.test#"><br>
<cfif isdefined('variables.test')>found in variables.test </cfif>
<cfif isdefined('variables.variables.test')>found in variables.variables.test </cfif>
<hr>
<cfdump var="#variables.title#"><br>
<cfif structkeyexists(variables,'title')>found in variables.title with structkeyexists </cfif>
<cfif structkeyexists(variables.variables,'title')>found in variables.variables.title with structkeyexists</cfif>
<cfif isdefined('variables.title')>found in variables.title </cfif>
<cfif isdefined('variables.variables.title')>found in variables.variables.title</cfif>
</cffunction>
但是运行它会给出:
yo
found in variables.test
mytitletext
found in variables.variables.title with structkeyexists
found in variables.variables.title
我觉得很奇怪,标题可以转储或作为 variables.title 输出,但不能用 isDefined 或 structkeyexists 检测到。有没有更有效的分配方式
<cfset variables = arguments.searchitems>
【问题讨论】:
-
首先,您需要了解任何对象的私有方法都驻留在变量范围内,并且按照您的方式进行操作将从 CFC 实例中清除它们。您可能想稍微抽象一下,例如:
variables.searchItems = arguments.searchItems,这样您就不会随意删除变量范围内的其他内容。稍后将查看您的其余逻辑... -
最简单的方法是使用属性。有些人可能会认为这是编程环境中的一种时尚失礼,但它仍然是最简单的方法。
-
当您设置
variables = arguments.searchitems时,您实际上是在变量范围内创建了一个名为“variables”的new 结构,即variables.variables。换句话说,您的variables结构不会取代真正的variables范围。当你转储variables.title时,CF 实际上是给你variables.variables.title。正在推断范围。StructKeyExists( variables,"title" )失败,因为变量 scope 中没有title变量(尽管它存在于您的variables结构中)。这有意义吗?
标签: coldfusion scope arguments cfc cffunction