我正在将一个应用程序从ColdFusion 9迁移到ColdFusion 11。
在现有代码中,有一个变量分配给false
<cfset VARIABLES.roleTypeId = false >
然后,再往下看,一个函数期望这个变量是数字的:
<cffunction name="rolesForStudy" >
<cfargument name="id" hint="Study Id">
<cfargument name="roleTypeId" default="#VARIABLES.roleTypeId#" type="numeric"/>
</cffunction>
我继承了这段代码,我不能为最初的程序员以这种方式设置它的决定辩护--但简而言之,它在ColdFusion 9中工作,在ColdFusion 11中不工作(返回数据类型错误)。我假设ColdFusion 9是自动将false
转换为0
的。
我的问题是:是否可以在ColdFusion 11中更改配置设置,使其像ColdFusion 9那样进行转换?或者,我是否必须修复这段代码,以及整个应用程序中可能还有很多其他类似的例子?我和我们的ColdFusion管理员都无法在ColdFusion管理员接口、ColdFusion文档或联机中找到有关这方面的任何信息。
编辑对评论中亚当·卡梅伦的回应
我已经创建了一个文件,该文件由以下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>
当我在ColdFusion 9中执行它时,它会显示单词“它成功了”。
当我在ColdFusion 11中执行它时,它返回以下错误消息:
如果将组件名称指定为此参数的类型,则可能找不到组件的定义文件或无法访问.。
发布于 2014-12-12 16:38:11
我相信你必须修正密码。没有任何设置(据我所知)可以改变CF处理布尔类型的方式。您应该能够将上面的分配从"false“更改为0,您的函数代码就可以工作了。然而,我怀疑在其他地方,您可能会有类似<cfif variables.roletypeID IS "False">
的东西,然后它就会被破坏,因为它实际上是在寻找一个字符串--这也很有效(ha)。CF将无数的值处理为布尔值(0或0、true、false、yes和no)是它的起源。有时很方便,但肯定会导致这样的事情。
同时,我不知道这种行为的改变是一个新的错误,还是一个旧的错误的修复。在我看来,把“假”当作论点,让它读成数字似乎不一致,所以新的方法对我来说似乎是正确的。然而,许多语言将0或不是0视为true和false的默认值。
编辑:
根据Adam下面的评论,我的代码示例中有人会说:
<cfif somevar IS "false">
即使...would确实是数字的,也是有效的。他的例子(有用)是:
#0 is "False"#
...will输出“是”-因此CF正在将字符串"false“重定向到引擎盖下的零,以便进行比较。这使我的例子不正确。
我的答案仍然是正确的,我相信。他遇到的问题是,传递给他的函数的参数--类型为"boolean“的参数--正在抛出一个错误,因为该函数需要一个数值。但是Adam的观点和例子让我认为这种行为可能是一个bug --因为CF在检查类型之前似乎没有转换成一个数字(根据Joe,它在CF 9中做了一些事情)。
发布于 2014-12-12 17:28:43
NumberFormat是你的救世主,在本·纳德尔的一篇文章中,我要归功于这句话。
<cfset VARIABLES.roleTypeId = false>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 0 -->
<cfset VARIABLES.roleTypeId = true>
#NumberFormat(VARIABLES.roleTypeId)# <!-- = 1 -->
因此,您应该能够在调用函数之前将其转换为预期的数字类型,或者只需执行以下操作
<cfargument name="roleTypeId" default="#NumberFormat(VARIABLES.roleTypeId)#" type="numeric">
发布于 2014-12-12 21:18:55
我在ColdFusion 11:"将布尔值传递给数字arg时,键入强制失败“中将此作为一个bug提出。
我建议您通过将类型检查从参数中删除来解决这一问题。这可能是影响最小的解决办法。
这也是一种罕见的情况,我会在代码中添加注释,解释为什么要取消类型检查。
向乔、马克和邓肯道歉,因为他们坚决地反驳了他们的发现。不过,我不同意他们的答案是最好的方法;)
https://stackoverflow.com/questions/27447751
复制相似问题