Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 将数据放入应用程序范围_Coldfusion - Fatal编程技术网

Coldfusion 将数据放入应用程序范围

Coldfusion 将数据放入应用程序范围,coldfusion,Coldfusion,对于我的查找表,对于应用程序中的每个用户都相同的表,我执行 Application.objectname = createobject(...).init(datasource) 在init方法中,我将表读入这个范围,如下所示: cfquery name="this.queryname" return this 现在,每当我需要引用查询时,我都可以这样引用它: cfselect query="Application.objectname.queryname" ... 问:这有什么问题吗?从

对于我的查找表,对于应用程序中的每个用户都相同的表,我执行

Application.objectname = createobject(...).init(datasource)
在init方法中,我将表读入这个范围,如下所示:

cfquery name="this.queryname"
return this
现在,每当我需要引用查询时,我都可以这样引用它:

cfselect query="Application.objectname.queryname" ...

问:这有什么问题吗?

从语法上说,没有。但是,我假设您还为该cfselect标记包含了一个name属性,因为它是必需的。

从语法上说,没有。但是,我假设您也为该cfselect标记包含了一个name属性,因为它是必需的。

没有,那就好了。服务器将把整个对象实例作为应用程序范围的一部分保存在内存中,应用程序范围将包括其所有属性

作为风格问题,我建议将您的查询设置为CFC中变量范围内的私有属性,而不是CFC的this范围内的公共属性。允许对象属性公开意味着作为黑盒设计器,您可以接受未知开发人员覆盖该值。如果这些是存储的数据库查找表,我猜您希望这些数据是只读的。考虑以下事项:

<cfcomponent hint="Proxy for database lookup tables" output="false">
    <cfproperty name="variables.lookupTable1" type="query" hint="[Private] lookupTable1 query object." />
    <cfproperty name="variables.lookupTable2" type="query" hint="[Private] lookupTable2 query object." />
    <!--- Implicit initialization --->
    <cfscript>
        variables.lookupTable1 = QueryNew('');
        variables.lookupTable2 = QueryNew('');
    </cfscript>

    <!--- Active initialization --->
    <cffunction name="init" returntype="void" access="public" hint="Initializes the query objects with data." output="false">
        <cfargument name="dsn" type="string" required="true" hint="The datasource to use." />
        <cfquery name="variables.lookupTable1" datasource="#arguments.dsn#">
            SELECT * FROM [TblFoo]
        </cfquery>
        <cfquery name="variables.lookupTable2" datasource="#arguments.dsn#">
            SELECT * FROM [TblBar]
        </cfquery>
    </cffunction>

    <!--- Data Fetching Methods --->
    <cffunction name="getFoo" returntype="query" access="public" hint="Returns the contents of TblFoo." output="false">
        <cfreturn variables.lookupTable1 />
    </cffunction>

    <cffunction name="getBar" returntype="query" access="public" hint="Returns the contents of TblFoo." output="false">
        <cfreturn variables.lookupTable2 />
    </cffunction>
</cfcomponent>

不,那很好。服务器将把整个对象实例作为应用程序范围的一部分保存在内存中,应用程序范围将包括其所有属性

作为风格问题,我建议将您的查询设置为CFC中变量范围内的私有属性,而不是CFC的this范围内的公共属性。允许对象属性公开意味着作为黑盒设计器,您可以接受未知开发人员覆盖该值。如果这些是存储的数据库查找表,我猜您希望这些数据是只读的。考虑以下事项:

<cfcomponent hint="Proxy for database lookup tables" output="false">
    <cfproperty name="variables.lookupTable1" type="query" hint="[Private] lookupTable1 query object." />
    <cfproperty name="variables.lookupTable2" type="query" hint="[Private] lookupTable2 query object." />
    <!--- Implicit initialization --->
    <cfscript>
        variables.lookupTable1 = QueryNew('');
        variables.lookupTable2 = QueryNew('');
    </cfscript>

    <!--- Active initialization --->
    <cffunction name="init" returntype="void" access="public" hint="Initializes the query objects with data." output="false">
        <cfargument name="dsn" type="string" required="true" hint="The datasource to use." />
        <cfquery name="variables.lookupTable1" datasource="#arguments.dsn#">
            SELECT * FROM [TblFoo]
        </cfquery>
        <cfquery name="variables.lookupTable2" datasource="#arguments.dsn#">
            SELECT * FROM [TblBar]
        </cfquery>
    </cffunction>

    <!--- Data Fetching Methods --->
    <cffunction name="getFoo" returntype="query" access="public" hint="Returns the contents of TblFoo." output="false">
        <cfreturn variables.lookupTable1 />
    </cffunction>

    <cffunction name="getBar" returntype="query" access="public" hint="Returns the contents of TblFoo." output="false">
        <cfreturn variables.lookupTable2 />
    </cffunction>
</cfcomponent>

如果这是使用查询对象的唯一位置,则可能需要缓存cfselect下拉框的输出:


如果您没有在onApplicationStart或onServerStart中设置应用程序范围变量,那么不要忘记使用

如果这是您使用查询对象的唯一位置,您可能希望缓存cfselect下拉框的输出:


如果您没有在onApplicationStart或onServerStart中设置应用程序范围变量,那么不要忘记使用

这很好,只要每个用户/请求/任何内容的查询结果都相同。如果需要更改,请不要使用应用程序范围。这很好,只要每个用户/请求/任何内容的查询结果都相同。如果需要更改,请不要使用应用范围。是的,我使用省略号表示我有意遗漏了一些内容。是的,我用省略号来表示我有意省略了一些内容。注意:不要忘记在所有函数中添加output=false,以消除CF生成的额外空白。我想它们是作为安全保护存在的,因此如果忘记调用init,getFoo和getBar不会抛出异常。你可以省略它们。@cf_菲利普斯-亨利是正确的;我更喜欢保持退货的一致性。如果我将某个东西初始化为空字符串,然后将其更改为查询、数组或结构,那么我总是有可能对变量执行cfreturn,而ColdFusion会崩溃,因为它不是它期望返回的类型。如果它注定是一个查询,我确保它始终是一个查询。空结果集比异常更容易管理。@Henry-当然,是的。我把它删掉了,以免我的答案太宽@Eric-这不是借口,你把access=public放在那里,这是默认值,无论如何都不需要…;:别忘了在所有函数中添加output=false,以消除CF生成的额外空白。我想它们是作为安全保护存在的,这样如果忘记调用init,getFoo和getBar就不会抛出异常。你可以省略它们。@cf_菲利普斯-亨利是正确的;我更喜欢保持退货的一致性。如果我将某个东西初始化为空字符串,然后将其更改为查询、数组或结构,那么我总是有可能对变量执行cfreturn,而ColdFusion会崩溃,因为它不是它期望返回的类型。如果它注定是一个查询,我确保它始终是一个查询。空结果集比异常更容易管理。@Henry-当然,是的。我把它删掉了,以免我的答案太宽@Eric-这不是借口,你把access=public放在那里,这是默认值,无论如何都不需要;