3

ColdFusion 服务器已更新至 ColdFusion 2018(从 ColdFusion 9 或 11)。

该服务器上最古老的应用程序之一包含如下代码:< cfif arguments[key] NEQ "">

之前,这似乎等同于isDefined("arguments.key")or StructKeyExists(arguments, key)

今天,即使isDefined("arguments.key")是假的,StructKeyExists(arguments, key)也是否定的,<cfif arguments[key] NEQ "">失败了,因为 arguments[key] 不再像空字符串那样表现。事实上,< cfdump var="#arguments[key]#">显示“未定义”。

为了避免在使用空字符串而不是在任何地方更改代码,我能做些什么StructKeyExists吗?也许是 ColdFusion 服务器参数?(THIS.enableNullSupport没有帮助)

4

2 回答 2

4

范围的括号表示法ARGUMENTS将始终为所有版本的 Adob​​e ColdFusion 中undefined不存在的键和值返回一个值。

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 中修复,这是经典的 Adob​​e 举措。

要么向 Adob​​e 报告此错误并希望获得更新(ACF 2018 的最后一次错误修复是在 2019 年 11 月完成的,所以祝你好运),或者不依赖这个狡猾的函数参数检查来修复你的旧应用程序。

于 2021-02-28T19:43:02.290 回答
0

IsDefinedValue 可能会有所帮助,因为它与 NULL 无关并且也检查值是否存在。

https://cflib.org/udf/isDefinedValue

于 2021-02-26T16:33:30.803 回答