我正在将应用程序从ColdFusion 9迁移到ColdFusion 11.
在现有代码中,有一个变量赋值false:
<cfset VARIABLES.roleTypeId = false >
Run Code Online (Sandbox Code Playgroud)
然后,更进一步,一个期望这个变量是数字的函数:
<cffunction name="rolesForStudy" >
<cfargument name="id" hint="Study Id">
<cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/>
</cffunction>
Run Code Online (Sandbox Code Playgroud)
我继承的代码,我不能保卫原来的程序员的决定,这样一来设置它-但,总之,它曾在ColdFusion的9,它不工作中的ColdFusion 11(返回数据类型错误).我假设ColdFusion 9自动转换false为0.
我的问题:我是否可以在ColdFusion 11中更改配置设置以使其像ColdFusion 9那样进行转换?或者我是否必须修复此代码,以及整个应用程序中可能还有许多其他类似示例?我和ColdFusion管理员都无法在ColdFusion Administrator界面,ColdFusion文档或在线中找到有关此信息的任何信息.
编辑以响应Adam Cameron的评论
我创建了一个由以下10行组成的文件(没有别的):
<cfset VARIABLES.roleTypeId = false >
<cfoutput>
<p>#rolesForStudy( 1, VARIABLES.roleTypeId )#</p>
</cfoutput>
<cffunction name="rolesForStudy" >
<cfargument name="id" hint="Study Id">
<cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/>
<cfreturn "It worked" >
</cffunction>
Run Code Online (Sandbox Code Playgroud)
当我在ColdFusion 9中执行它时,它会显示"It working"字样.
当我在ColdFusion 11中执行它时,它返回以下错误消息:
如果组件名称被指定为此参数的类型,则可能无法找到组件的定义文件或无法访问该组件的定义文件.
我相信你必须修复代码.没有任何设置(我知道无论如何)改变了CF处理布尔类型的方式.您应该能够将上面的分配从"false"更改为0,并且您的功能代码将起作用.然而,我怀疑在其他地方你可能会有类似的东西<cfif variables.roletypeID IS "False">然后会被打破,因为它实际上正在寻找一个字符串 - 这也有效(哈).CF将无数值处理为boolean(0或0,true,false,yes和no)是它的起源遗产.它有时很方便,但肯定会导致这样的事情.
同时我想知道这种行为的改变是一个新的错误还是修复了一个旧的bug.在我看来,将"假"作为一个参数传递并将其读作数字似乎不一致,所以新的做法对我来说似乎是正确的.但是,许多语言将0或0视为true和false的默认值.
编辑:
根据Adam在下面的评论,我的代码示例,有人会说:
<cfif somevar IS "false">
Run Code Online (Sandbox Code Playgroud)
......即使somevar确实是数字的,它也会起作用.他的例子(有用)是:
#0 is "False"#
Run Code Online (Sandbox Code Playgroud)
...将输出"是" - 因此CF将字符串"false"重新设置为引擎盖下的零以进行比较.这使我的例子不正确.
我相信我的答案仍然是正确的.他遇到的问题是传递给他的函数的参数 - 属于"boolean"类型会引发错误,因为函数需要一个数值.但是亚当的观点和例子让我觉得这个行为可能是一个错误 - 因为看起来CF在检查类型之前没有投射到数字(根据Joe的说法,它在CF 9中做了什么).
| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |