关于ColdFusion组件构造函数名称的问题

关于ColdFusion组件构造函数名称的问题,coldfusion,constructor,init,Coldfusion,Constructor,Init,我对ColdFusion中的构造函数有一些问题: 我必须使用名称init作为构造函数名称吗 如果在不调用init方法的情况下创建组件的实例,将返回什么 instance=createObject(“组件”、“cfcName”);//实例现在有什么价值 我是否可以取出init方法中的代码并删除init方法,然后将代码粘贴到组件的头部,它是否具有与init构造函数相同的效果 非常感谢 我必须使用名称init作为构造函数名称吗 不,您可以按自己喜欢的方式命名初始化函数init()只是一种惯例。它不

我对ColdFusion中的构造函数有一些问题:

  • 我必须使用名称
    init
    作为构造函数名称吗
  • 如果在不调用init方法的情况下创建组件的实例,将返回什么

    instance=createObject(“组件”、“cfcName”);//实例现在有什么价值

  • 我是否可以取出init方法中的代码并删除init方法,然后将代码粘贴到组件的头部,它是否具有与init构造函数相同的效果

  • 非常感谢

    我必须使用名称init作为构造函数名称吗

    不,您可以按自己喜欢的方式命名初始化函数
    init()
    只是一种惯例。它不是真正的构造函数,因为它不是自动调用的

    如果在不调用init方法的情况下创建组件的实例,将返回什么

    正如您所期望的那样,将返回组件实例。是否存在
    init()
    函数完全无关。ColdFusion组件中没有静态函数的概念,您总是从
    GetObject(“组件”),获得一个完全构造的实例。(如果您忘记/没有手动创建Java对象,则在首次使用之前构建的Java对象就不是这样了。)

    我是否可以取出init方法中的代码并删除init方法,然后将代码粘贴到组件的头部,它是否具有与init构造函数相同的效果

    是的,只要
    init()


    但是,通常有一个名为
    init()
    的方法返回组件实例。即使它除了“
    ”之外什么也不做。我会保持一致,并在每个组件中添加一个组件,即使它不是严格必需的。

    Tomalak的答案对于ColdFusion 8是正确的;然而,随着今年晚些时候推出的ColdFusion 9,情况正在发生一些变化。(为了完整起见,我将复制Tomalak的答案,并根据需要进行调整,因此感谢您的领先优势。:)


    我必须使用名称init作为构造函数名称吗

    CF8:不,您可以随意命名初始化函数--“init”只是一种约定。而且它不是真正的构造函数,因为它不是自动调用的

    CF9:答案仍然是“不”,你不必这么做。但您可能需要这样做:这适用于在cfscript中创建对象(或仅脚本组件,也将在CF9中提供)。正在添加
    import
    new
    关键字,您将能够创建如下对象的实例:

    import model.security.*;
    userObj = new User();
    
    这假设您在
    model/security/
    文件夹中有一个
    User.cfc
    。此外,CF9将查找是否存在名为“init”的方法或与对象同名的方法(在本例中为“User”),并隐式调用该方法作为构造函数

    我不确定将参数传递给
    new
    指令是否会像您在Java/C中看到的那样将它们转发给构造函数。我认为会,但我还没有看到任何表示这种或那种方式的演示文稿或代码示例;我自己也没有测试过,因为我在写这篇文章时才想到这一点(另一个想法:我想知道是否会支持具有不同参数集的多个构造函数。我对此表示怀疑,但这是个好主意。)

    我假设CFML(基于标记的语言,与cfscript分离)中可能会出现类似的功能,但目前还没有对此做任何说明

    如果在不调用init方法的情况下创建组件的实例,将返回什么

    正如您所期望的那样,将返回组件实例。init()函数的存在与否完全无关。ColdFusion组件中没有静态函数的概念,您总是从GetObject(“组件”,…)获得完全构造的实例。(如果您忘记/没有手动创建Java对象,则在首次使用之前构建的Java对象就不是这样了。)

    我是否可以取出init方法中的代码并删除init方法,然后将代码粘贴到组件的头部,它是否具有与init构造函数相同的效果

    是的,只要init()方法没有任何参数,就没有区别


    但是,有一个名为init()的方法返回组件实例(“this”)是一种约定。即使它除了“
    返回这个;
    ”之外什么也不做。我会保持一致,并为每个组件添加一个组件,即使它不是严格必需的。

    一些第三方库/框架可能期望
    init
    成为构造函数(显然,在CF9之前)。例如,我相信ColdSpring在尝试传入构造函数参数时会查找名为
    init
    的方法

    作为对Adam的回答的回应,我非常确定多个构造函数不会成为CF9的一部分,因为这需要方法重载,而我对此一无所知。通常的解决方法是利用Duck类型和检查类型的参数,并提供可选参数(传入命名参数的功能使其相当容易处理)


    肖恩·科菲尔德(Sean Corfield)关于鸭子打字的演讲链接:

    我自己回答得再好不过了。:)只想补充一点,将其称为“init”的约定可能来自CreateObject(“java”,…)使用.init()调用java类的构造函数。使用init方法和适当的参数来调用该类的实例。例如:“根据我答案顶部的注释,这是正确的——但是有一些新的令人兴奋的东西出现了。感谢您的内容领先,给您一个+1分。:)+1对于添加的CF9,非常有趣。我们还在继续