dav*_*urg 1 coldfusion components pointers
我正在构建一个Coldfusion组件的问题.好吧,我不确定这是一个问题,或者事情是如何起作用的,但这看起来很奇怪.首先,我为我的组件的init函数设置参数并调用组件.但是如果我在调用后更改其中一个参数,它也会更改组件中保存的值.它是否正确?
我不确定我是否能很好地解释这一点.这是一些伪代码:
<cfset fruit = [] />
<cfset fruit[1] = {
id = 1,
name = "apple"
} />
<cfset fruit[2] = {
id = 2,
name = "orange"
} />
<cfset args = {
title = "Fruit",
data = fruit
} />
<cfinvoke component="test" method="init" returnvariable="test" argumentcollection=#args# />
<cfset fruit[2].name = "banana" />
Run Code Online (Sandbox Code Playgroud)
该init函数将title和data参数存储在组件的variables范围中.
现在,如果我从test对象输出数据,我得到apple和banana.但我期望该组件保留在调用期间收到的数据.
如果我需要澄清任何事情,请告诉我.谢谢你的帮助!
我不确定这是一个问题,或者事情是如何起作用的,
是的,这就是您当前代码的工作方式.这是否是你想要它的行为是一个不同的问题..
大多数复杂对象(结构,组件,etectera)都通过引用传递.这意味着您实际上只是存储指向对象的指针,而不是实际值.因此,您将始终看到对基础对象所做的任何更改.这就是输出test变化的原因.
数组是一个例外.它们通常(但并不总是)按值传递.这意味着您有一个独立的副本,不会反映对原始对象所做的任何更改.
你的例子很有趣,因为它包含两者.嵌套结构(name=orange=> name=banana)的更改在组件中可见,因为结构是通过引用传递的.但是父数组不是.所以你可以清除fruit,它对组件没有任何影响.
例:
<cfset fruit[2].name = "bananna" />
<!--- both dumps will show "bananna" --->
<cfdump var="#fruit#" label="Fruit Before" />
<cfdump var="#test.getDataArray()#" label="Test.Data Before" />
<cfset arrayClear(fruit) />
<!--- fruit is empty and the component array is not --->
<cfdump var="#fruit#" label="Fruit After" />
<cfdump var="#test.getDataArray()#" label="Test.Data After" />
Run Code Online (Sandbox Code Playgroud)
测试:
<cfcomponent>
<cffunction name="init" returntype="any" ...>
<cfargument name="title" type="string" required="true" />
<cfargument name="data" type="array" required="true" />
<cfset variables.title = arguments.title />
<cfset variables.data = arguments.data />
<cfreturn this />
</cffunction>
<cffunction name="getDataArray" returntype="array">
<cfreturn variables.data />
</cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)
现在,如果我从测试对象输出数据,我会得到苹果和香蕉.
对.这是可以预料到的,因为结构是通过引用传递的.如果您希望组件维护独立副本,则需要duplicate()(即深层复制)data内部元素init().
<cfset variables.data = duplicate(arguments.data) />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |