【问题标题】:ColdFusion 9 CFScript Private Properties and Public PropertiesColdFusion 9 CFScript 私有属性和公共属性
【发布时间】:2011-10-04 01:21:36
【问题描述】:

有没有办法让 isDevMode、devModeToEmailAddress、devModeFromEmailAddress 成为私有属性?

代码:

/**
* email
* @accessors true
*/
component email output="false" hint="This is email object." {

/* properties */
property name="toEmailAddress"   type="string";
property name="fromEmailAddress" type="string";
property name="subject"          type="string";
property name="body"             type="string";
property name="attachments"      type="array";

/*
private isDevMode
private devModeToEmailAddress
private devModeFromEmailAddress
*/

}

【问题讨论】:

  • 你的意图是什么?属性(除其他外)在 CF 中定义访问器,这意味着它们应该可供访问(因此,不是私有的)。您是否试图在 ORM 中强制执行到私有变量的关系映射?或者,您是否“只想要一些私有变量”——如果是后者,您需要将它们设置在“变量”范围内。
  • 我没有使用 ORM 我只是想要只能在对象内部而不是对象外部设置的属性。这样,如果网站处于开发模式,电子邮件不会发送给客户,但在生产时它们工作得很好。
  • 下面丹的答案是你想要的。

标签: oop coldfusion coldfusion-9


【解决方案1】:

您可以添加setter="false"getter="false" 来阻止getter 和setter,但您不能直接限制对属性的访问。最好的选择是将它们放入组件本地范围内的构造函数中。

/**
* email
* @accessors true
*/
component email output="false" hint="This is email object." {

isDevMode = false;
devModeToEmailAddress = "foo@foo.com";
devModeFromEmailAddress = "bar@foo.com";

/* properties */
property name="toEmailAddress"   type="string";
property name="fromEmailAddress" type="string";
property name="subject"          type="string";
property name="body"             type="string";
property name="attachments"      type="array";


}

然后,当您需要使用它们时,只需在任何函数中引用 variables.isDevMode 即可获取值。如果您需要在运行时设置它们,您可以在函数的init() 方法中设置它们。我通常这样做:

component email output="false" hint="This is email object." {

    instance = {};

    /* properties */
    property name="toEmailAddress"   type="string";
    property name="fromEmailAddress" type="string";
    property name="subject"          type="string";
    property name="body"             type="string";
    property name="attachments"      type="array";


    public email function(required boolean isDevMode, required string devModeToEmailAddress, required string devModeFromEmailAddress){

        variables.Instance.isDevMode = Arguments.isDevMode;
        variables.Instance.devModeToEmailAddress = Arguments.devModeToEmailAddress;
        variables.Instance.devModeFromEmailAddress = Arguments.devModeFromEmailAddress;

    {

}

然后,只要我需要这些值,我就会得到variables.Instance.isDevMode。我还创建了一个通用的get() 方法,它将返回variables.instance,这样我就可以看到里面有什么。

public struct function get(){
    return Duplicate(variables.Instance);
}

但是因为这些在组件局部变量范围内,所以不能从组件外部修改。

【讨论】:

  • 我认为你仍然可以通过引用来修改结构。因此,您可能希望在返回结构之前duplicate()
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 2012-02-23
  • 2010-11-30
  • 2015-06-09
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多