我正在尝试在Lucee上的组件上使用综合访问器(尽管在ColdFusion上这个问题似乎也是如此)。

复制代码:

// Person.cfc
component accessors=true {

    property firstName;
    property lastName;

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

}


和调用代码:

// person.cfm
person = new Person("Abigail", "Bowen");
writeDump(person);


请注意,这里我是如何不使用综合访问器的,我只是将参数值设置为同名变量作用域变量。

但是,当我运行此代码时,会看到以下内容:



请注意如何填充属性。这样做没有问题,但是我显然不了解accessors标志应该如何工作。我以为它只是为我综合一些访问器方法(它具有),仅此而已。

还要注意,如果我将CFC定义修改为不将访问器设置为true,则转储将显示以下内容:



因此,没有合成的访问器(如预期的那样),但是现在甚至都没有显示属性(无论是否具有变量作用域值)。

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

如果仅在其中一个平台上看到此内容,则可能将其归因于writeDump()如何解释属性定义。但是,行为在ColdFusion 11上是相同的,因此确实确实存在一些我不太了解的行为差异。

有人可以解释吗?是否有任何文档对此进行解释?如果不是...嗯...为什么不呢?

我的基本担心是,属性值未“正确”存储,一旦实现更多代码,可能会引起问题。

更新:
至少在ColdFusion上,这似乎只是writeDump()行为的变化,因为如果属性具有吸气剂(是否设置了accessors标志),则属性值将开始显示在转储中。但是,在Lucee上并非如此,因此那里仍然存在一个问号。

为了全面公开,此问题是我也在博客(“ CFML: trying to understand accessors”)上提出的问题的摘要。重复是有意的,因为我的博客与该网站的访问者不同。

最佳答案

如果没有accessors=true,则property声明只是元数据。

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

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

08-19 22:47