组件上具有accessors = true的意外行为

Ada*_*ron 11 coldfusion cfml lucee

我试图在Lucee上的组件上使用合成访问器(虽然这个问题在ColdFusion上似乎也是一样的).

Repro代码:

// Person.cfc
component accessors=true {

    property firstName;
    property lastName;

    function init(firstName, lastName){
        variables.firstName = arguments.firstName;
        variables.lastName = arguments.lastName;
    }

}
Run Code Online (Sandbox Code Playgroud)

和调用代码:

// person.cfm
person = new Person("Abigail", "Bowen");
writeDump(person);
Run Code Online (Sandbox Code Playgroud)

注意我在这里没有使用合成访问器,我纯粹是将参数值设置为同名变量范围的变量.

但是,当我运行此代码时,我看到:

转储输出显示属性

请注意如何填充属性.这没有问题,但我显然不明白accessors旗帜应该如何运作.我认为它只是为了为我(它有)合成一些存取方法,但这就是全部.

另请注意,如果我将CFC定义修改为将访问器设置为true,则转储显示如下:

转储没有属性

因此没有合成访问器(如预期的那样),但现在甚至没有显示属性(使用变量范围值或不具有变量范围值).

我真的不明白"属性"和访问者设置的这种混淆吗?当然,访问者设置应该只影响是否创建了这些访问器方法?

如果我只是在其中一个平台上看到这个,我可能会把它归结为如何writeDump()解释属性定义的变幻莫测.但是ColdFusion 11的行为是一样的,所以看起来我的行为似乎有些不同.

有谁能解释一下?有没有解释它的文档?如果不是......嗯...为什么不呢?

我的基本担忧是,属性值没有"正确"存储,并且一旦我实现了更多的代码,可能会给我带来问题.

更新:至少在ColdFusion上,它似乎只是一个writeDump()行为的改变,因为如果有属性的getter(无论是否accessors设置了标志),那么属性值开始显示在转储中.但是Lucee的情况并非如此,所以那里仍然存在问号.

为了充分披露,这个问题是我在博客上提出的一个问题的摘要(" CFML:试图理解访问者 ").复制是故意的,因为我的博客与本网站的受众不同.

Sea*_*eld 10

没有accessors=true,property声明只是元数据.

使用时accessors=true,property声明会触发getter/setter的生成,因此a property既是variables范围项是一对方法.

在构造函数中,您分配variables范围项 - 这与使用生成的setter相同 - 当CFML转储组件时,它会看到property元数据和生成的getter,因此它显示这些属性具有的值(从它可以轻松安全地调用生成的getter).