ColdFusion中的自动类型转换11

Joe*_*ose 5 coldfusion

我正在将应用程序从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自动转换false0.

我的问题:我是否可以在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中执行它时,它返回以下错误消息:
如果组件名称被指定为此参数的类型,则可能无法找到组件的定义文件或无法访问该组件的定义文件.

Mar*_*ger 7

我相信你必须修复代码.没有任何设置(我知道无论如何)改变了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中了什么).

  • 有时你只需要对旧代码进行解密. (3认同)