ColdFusion中的静态方法是什么?

本文关键字:是什么 静态方法 ColdFusion | 更新日期: 2023-09-27 18:07:29

在c#中,我创建了静态方法来帮助我执行简单的操作。例如:

public static class StringHelper
{
    public static string Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

然后在控制器中,我将通过简单地使用

来调用它
StringHelper.Reverse(input);

现在我正在使用ColdFusion和Model Glue,我想做同样的事情。然而,ColdFusion中似乎没有静态方法的概念。如果我像这样创建一个CFC:

component StringHelper
{
    public string function Reverse(string input)
    {
        // reverse string
        return reversedInput;
    }
}

我只能通过在控制器中创建StringHelper的实例来调用这个方法吗?

component Controller
{
    public void function Reverse()
    {
        var input = event.getValue("input");
        var stringHelper = new StringHelper();
        var reversedString = stringHelper.Reverse(input);
        event.setValue("reversedstring", reversedString);
    }
}

或者有一些地方,我可以把"静态"CFCs框架将创建一个实例的幕后,所以我可以使用它,如果它是静态的,有点像助手文件夹的工作方式?

ColdFusion中的静态方法是什么?

不,你是正确的,ColdFusion中没有静态方法的概念。我认为大多数人会通过在应用程序启动时创建的应用程序范围内使用单例实用程序来解决这个问题。在app。cfc的onApplication start中可以输入:

<cfset application.StringHelper = createObject("component", "path.to.StringHelper") />

当你需要从任何地方调用它时,你会使用:

<cfset reversedString = application.StringHelper.reverse(string) />

是的,它不像静态方法那样干净。也许有一天我们也能拥有这样的东西。但现在我认为这是你能得到的最接近的了。

在coldfusion中创建静态的一种方法是将函数或变量放在对象的元数据中。它并不完美,但就像静态一样,你不需要创建对象的实例来调用它们,它们将持续到服务器重新启动,所以它们在第一次调用后相当快。

下面是一个简短的代码片段:

component name="Employee"
{
 public Employee function Init(){
  var metadata = getComponentMetaData("Employee"); 
  if(!structKeyExists(metadata,"myStaticVar")){
   lock name="metadata.myStaticVar" timeout="10"{
    metadata.myStaticVar = "Hello Static Variable."; 
   }
  }
  return this;
 }
}

更多细节在这里:http://blog.bittersweetryan.com/2011/02/using-metadata-to-add-static-variables.html.

CFML在2021年+支持静态方法和静态变量,因为现在Adobe已经在ColdFusion 2021中实现了它(Lucee从5.0开始支持它)。下面是一个名为Cube的组件的代码示例。CFC和索引。cfm文件,它使用我在另一个SO线程中使用的静态方法。我在这里添加这些信息是为了完整性。

CFC组件Cube.cfc

component displayname="Cube" accessors ="true" {
    // class properties
    property name="name" type="string";
    property name="model" type="string";
    property name="borderColor" type="string";
    property name="material" type="string";
    property name="dimension" type="struct";
    
    // set static varibales
    static { 
        private models =[ "model-a",  "model-b", "model-c" ];
        private modelNameMaterialMapping ={
            "model-a": "wood",
            "model-b": "steel",
            "model-c": "silver"
        };
        private modelNameDimensionsMapping ={
            "model-a": {"height": 100, "length": 100, "width": 100 },
            "model-b": {"height": 133, "length": 133, "width": 133 },
            "model-c": {"height": 85, "length": 85, "width": 85 }
        };
    };
 
    public any function init( 
        string name,
        string borderColor,
        string model
    ){
        setName( arguments.name );
        setBorderColor( arguments.borderColor );
        setModel( arguments.model );
        setMaterial(  static.getMaterialByModelName( arguments.model ) );
        setDimension( static.getDimensionByModelName( arguments.model ) );
        return this;
    }
   
    public static string function getMaterialByModelName( string modelName  ){
        return static.modelNameMaterialMapping[ arguments.modelName ];
    }
    public static struct function getDimensionByModelName( string modelName  ){
        return static.modelNameDimensionsMapping[ arguments.modelName ];
    }
    public static string function isValidModel( string model ){
        return static.models.contains( arguments.model );
    }

 }

索引。cfm文件调用静态方法:

<cfscript>
 
    modelsForChecking=[
        "model-a",
        "model-k",
        "model-c",
        "model-z"
    ];
    // loop through model information without having any object instantiated by calling static functions
    for( model in modelsForChecking){
        if( Cube::isValidModel( model )){
            writeOutput("Cube ""#model#"" is valid.<br>");
            writeOutput( "Cube models ""#model#"" are made of ""#Cube::getMaterialByModelName( model )#"" and a dimension of ""#Cube::getDimensionByModelName( model ).width#x#Cube::getDimensionByModelName( model ).length#x#Cube::getDimensionByModelName( model ).height#""<br>");
        }else{
            writeOutput("Cube ""#model#"" is NOT a valid model.<br>");
        }
    }
    //intantiate a specific cube object with the name "CubeOne";
    writeOutput( "Instantiate an object with the component:<br>");
    CubeOne=new Cube("CubeOne", "white", "model-c" );
    
    // dump properties of the specific cube "CubeOne"
    writeDump( CubeOne );
    // get width with the accesso getter for property dimension for the cube named "CubeOne"
    writeOutput("""CubeOne"" has a width of #CubeOne.getDimension().width# <br>");
  
</cfscript>