我对 ColdFusion 中的构造函数有一些疑问:
- 我必须使用该名称
init
作为构造函数名称吗? 如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?
instance=createObject("组件","cfcName"); // 现在实例持有什么值
能不能把init方法里的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数的效果一样?
十分感谢。
我对 ColdFusion 中的构造函数有一些疑问:
init
作为构造函数名称吗?如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?
instance=createObject("组件","cfcName"); // 现在实例持有什么值
能不能把init方法里的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数的效果一样?
十分感谢。
我必须使用名称 init 作为构造函数名称吗?
不,您可以随意命名初始化函数。init()
只是一个约定。它不是真正的构造函数,因为它不会自动调用。
如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?
如您所料,组件实例被返回。功能的存在与否init()
是完全无关的。ColdFusion 组件中没有静态函数的概念,您总是从GetObject("component", ...)
. (如果您忘记/没有手动操作,Java 对象就不是这样了,它们是在第一次使用之前构建的。)
能不能把init方法里的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数的效果一样?
是的,只要init()
方法不带任何参数,就没有区别。
但是,约定调用init()
一个返回组件实例的方法。即使它除了“ ”之外什么都不<cfreturn this>
做。我会保持一致并为每个组件添加一个,即使这不是绝对必要的。
Tomalak 的回答对于 ColdFusion 8 是正确的;然而,今年晚些时候发布的 ColdFusion 9 正在发生一些变化。(为了完整起见,我将复制 Tomalak 的答案并进行适当调整,因此感谢您的领先。:))
我必须使用名称 init 作为构造函数名称吗?
CF8:不,你可以为初始化函数命名任何你喜欢的名字——“init”只是一个约定。而且它不是真正的构造函数,因为它不会自动调用。
CF9:答案仍然是“不”,你不必。但是您应该这样做:这适用于在 cfscript(或仅脚本组件,也将在 CF9 中出现)中创建对象。和关键字正在被添加import
,new
您将能够像这样创建对象的实例:
import model.security.*;
userObj = new User();
这假设您在文件夹User.cfc
内有一个。model/security/
此外,CF9 将查找名为“init”的方法或与对象同名的方法(在本例中为“User”)的存在,并将其隐式调用为构造函数。
我不确定将参数传递给new
指令是否会将它们转发给构造函数,就像您在 Java/C 中看到的那样。我认为它会,但我还没有看到任何表示一种或另一种方式的演示文稿或代码示例;并没有自己测试它,因为它只是在写这篇文章时突然想到的。;)(另一个想法:我想知道是否会支持具有不同参数集的多个构造函数。我对此表示怀疑,但这是一个好主意。)
我假设类似的功能可能会出现在 CFML(基于标签的语言,与 cfscript 分开)中,但目前对此没有任何说法。
如果我在不调用 init 方法的情况下创建组件的实例,会返回什么?
如您所料,组件实例被返回。init() 函数的存在与否是完全无关的。ColdFusion 组件中没有静态函数的概念,您总是从 GetObject("component", ...) 获得完全构造的实例。(如果您忘记/没有手动操作,Java 对象就不是这样了,它们是在第一次使用之前构建的。)
能不能把init方法里面的代码取出来,把init方法删掉,然后把代码粘贴到组件的头部,是不是和init构造函数一样的效果?
是的,只要init() 方法不带任何参数,就没有区别。
但是,约定使用一个名为 init() 的方法返回组件实例(“this”)。即使它除了“ return this;
”之外什么都不做。我会保持一致并为每个组件添加一个,即使这不是绝对必要的。
一些第 3 方库/框架可能期望init
成为构造函数(显然,CF9 之前)。例如,我相信 ColdSpringinit
会在尝试传入构造函数参数时寻找调用的方法。
作为对亚当的回答,我很确定多个构造函数不会成为 CF9 的一部分,因为这需要方法重载,我还没有听说过。通常的解决方法是利用 Duck 类型和检查参数的类型,并提供可选参数(传递命名参数的能力使得这很容易处理)。
Sean Corfield 关于 Duck Typing 的演示文稿的链接:http: //corfield.org/articles/ducktyping_cfunited.pdf