我正在尝试在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)。