问题描述
ColdFusion 服务器已更新至 ColdFusion 2018(从 ColdFusion 9 或 11)。
该服务器上最古老的应用程序之一包含如下代码:< cfif arguments[key] NEQ "">
以前,这似乎等同于 isDefined("arguments.key")
或 StructKeyExists(arguments,key)
。
今天,即使 isDefined("arguments.key")
为假,StructKeyExists(arguments,key)
也是负数,<cfif arguments[key] NEQ "">
失败,因为 arguments[key] 不再像空字符串一样。实际上,< cfdump var="#arguments[key]#">
显示的是“未定义”。
我可以做些什么来避免在使用空字符串而不是 StructKeyExists
的任何地方更改代码?也许是 ColdFusion 服务器参数? (THIS.enableNullSupport
没有帮助)
解决方法
ARGUMENTS
范围的括号表示法将始终为不存在的键和值返回 undefined
值在所有版本的 Adobe ColdFusion 中。
function f() {
return arguments[key];
}
f(); // returns undefined
function f() {
return arguments["key"];
}
f(); // returns undefined
function f() {
return arguments.key;
}
f(); // throws exception: Element KEY is undefined in ARGUMENTS
所有 3 种情况都应该抛出异常。这是不一致的,应该被视为错误。保留它可能只是为了向后兼容。
无论如何,正如您已经注意到的:
// ACF 10
(undefined eq "") -> TRUE
// ACF 11
(undefined eq "") -> TRUE
// ACF 2016
(undefined eq "") -> TRUE
// ACF 2018
(undefined eq "") -> FALSE
// ACF 2021
(undefined eq "") -> TRUE
Adobe 在 ACF 2018 中引入了 NULL 支持并打破了这种行为。他们在 ACF 2021 中修复了它,但在 ACF 2018 中没有修复,这是 Adobe 的经典举措。
要么将此错误报告给 Adobe 并希望得到更新(ACF 2018 的最后一次错误修复是在 2019 年 11 月完成的,祝你好运)或通过不依赖这个狡猾的函数参数检查来修复您的旧应用程序。
,IsDefinedValue 可能会有所帮助,因为它与 NULL 无关并检查值是否存在。