我在这里遇到了一些奇怪的类型转换问题,不是特定于 Lucee(也在 Railo 中)。可能是我只是在这里错过了一些关键点......
我有一个组件:
<cfcomponent output="false">
<cfproperty name="thisId" type="String" default="-1" />
<cfproperty name="thatId" type="String" default="-1" />
</cfcomponent>
这两个属性都明确键入为字符串。我希望当我尝试将对象或数字设置为其中之一时,代码将返回错误。但是,由于我现在已经习惯了 cfml 为我进行类型转换,所以我从来没有考虑过在这里设置一个数字根本没有问题的事实。事实上,我假设我在这里尝试设置的所有数字都会为我转换为字符串。
似乎情况并非如此。在以序列化结构的形式实现了一些包含这些组件的派生类的 REST 调用之后,我注意到有些作为整数包含,有些作为字符串包含。当我注意到这一点时,我转储了组件本身,并注意到在期望字符串作为属性的地方设置了一个数字,输入已被覆盖为数字。
在我看来,Railo / Lucee 仍然验证的事实毫无用处。验证严格类型并抛出错误/传入正确类型的变量,或者验证松散类型并在可能的情况下转换为 CFC 期望的类型。Railo / lucee 在这里实现了松散的类型验证,但仍然决定以原始类型传递变量,而不是 cfc 期望的每个 sé。
鉴于我现在不想将每个数字都转换为字符串,这里是否有一个简单的疏忽可以挽救我的打字?
(我已经在 Lucee 邮件列表中发布了这个,但没有任何结果,只是人们确认了我已经说过的话/忽略了这不是预期行为的可能性。)
更新(如亚当所问): 我看到的是以下内容(在我上面描述的 cfc 组件中):
<!--- setting a string returns a string afterwards, as expected since the property is a type string initialy --->
<cfset componentName.setThisId('1') />
<cfset local.thisIsStillAString = componentName.getThisId() />
<!--- setting a number returns a number, which means we can no longer assume the property is a string, as it was initially set up --->
<cfset componentName.setThatId(12345) />
<cfset local.thisIsNoLongerAString = componentName.getThatId() />
在这两种情况下,我都希望: - 输入变量将被严格评估为字符串,这意味着第二个示例会引发错误,因为它实际上是一个数字 - 输入变量将被松散地评估为字符串, 但在通过评估时会被强制转换为字符串,这意味着第二个示例将通过但最终将返回一个字符串,而不是数字。
在任何情况下,我都希望保留属性的原始类型,而是将其更改为您尝试设置的任何类型,只要它通过当前的松散评估即可。