Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In a Coldfusion cfc, what is the scope name for variables set outside of a function?

Tags:

coldfusion

cfc

In a Coldfusion component / CFC, I want to properly scope some variables to be available for all contained functions, but to be hidden or blocked from outside scripts. What is the name of the cfc's memory scope? Is it 'variables'? Is that available inside a contained function? Is it blocked from outside the cfc?

(Examples in CF 8)

Calling page:

<cfset settings = structNew()>
<cfset util = createObject("component", "myUtils").init(settings)>
<cfoutput>
    #util.myFunction()#
</cfoutput>

myUtils.cfc:

<cfcomponent>
<!--- Need to set some cfc global vars here --->

    <cffunction name="init" access="public">
        <cfargument name="settings" type="struct" required="no">
        <!--- I need to merge arguments.settings to the cfc global vars here --->
        <cfreturn this>
    </cffunction>

    <cffunction name="myFunction" access="public">
        <cfset var result = "">
        <!--- I need to access the cfc global vars here for init settings --->
        <cfreturn result>
    </cffunction>
</cfcomponent>

Additional best practice suggestions are welcomed. It's been quite a while since I've done this. Thanks in advance.

like image 497
Dan Sorensen Avatar asked Dec 17 '09 19:12

Dan Sorensen


People also ask

What is variable scope in ColdFusion?

The VARIABLES scope is the default scope in ColdFusion. i.e. if a variable is declared in . cfm and . cfc file without explicitly prefixing a scope, or without 'var' to a variable inside a function, ColdFusion assigns VARIABLES scope to that variable.

What is CFC in ColdFusion?

Application component written in CFML (ColdFusion Markup Language), a programming language used to build Internet applications; contains data and functions, called methods, for an application module; defined within the file using a <cfcomponent> tag.

How do you call a CFC in ColdFusion?

To invoke a component method of a CFC instance, use the cfinvoke tag and specify the following: The CFC instance name, enclosed in number signs (#), in the component attribute. The method name, in the method attribute.


2 Answers

Within a ColdFusion component, all public names are in the This scope and all private names are in the Variables scope. Names may include both "normal" variable properties as well as "UDF" methods. Within a ColdFusion component, the This and Variables scopes are per-instance and are not shared between instances.

Outside a ColdFusion component, you may use any public names (names that would be available within the component in the This scope) using the struct notation. You may not access any private names.

The default scope is always Variables - within a component, outside of a component, within a UDF, within a component method, etc.

Note that there is no such thing as a "memory" scope. There are named scopes, but not memory scopes.

like image 160
yfeldblum Avatar answered Sep 25 '22 10:09

yfeldblum


Yes, it is the default, variables scope.

<cfcomponent output="false">
    <cfset variables.mode = "development">

    <cffunction name="getMode" output="false">
        <cfreturn variables.mode>
    </cffunction>
</cfcomponent>

It is a good idea to scope all your variables in cffunctions in CFC.

Don't forget output="false", it will cut down a lot of whitespace CF generates. I usually will leave out access="public" since that's the default.

If you want better documentation when others browse to your CFC, you may even consider using

<cfcomponent output="false">
    <cfproperty name="mode" type="string" default="development" hint="doc...">

    <cfset variables.mode = "development">

    <cffunction name="getMode" output="false">
        <cfreturn variables.mode>
    </cffunction>
</cfcomponent>
like image 20
Henry Avatar answered Sep 23 '22 10:09

Henry