2009-12-17 5 views
7

En un componente/CFC de Coldfusion, quiero delimitar correctamente algunas variables para que estén disponibles para todas las funciones contenidas, pero que se oculten o bloqueen desde scripts externos. ¿Cuál es el nombre del alcance de la memoria del cfc? ¿Son 'variables'? ¿Está eso disponible dentro de una función contenida? ¿Está bloqueado desde fuera del cfc?En Coldfusion cfc, ¿cuál es el nombre de ámbito para las variables establecidas fuera de una función?

(Ejemplos en la FQ 8)

página de llamada:

<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> 

indicaciones de buenas prácticas adicionales son bienvenidas. Ha pasado bastante tiempo desde que hice esto. Gracias por adelantado.

Respuesta

14

Dentro de un componente de ColdFusion, todos los nombres públicos están en el alcance This y todos los nombres privados están en el alcance Variables . Los nombres pueden incluir tanto propiedades de variables "normales" como métodos "UDF". Dentro de un componente de ColdFusion, los ámbitos This y Variables son por instancia y no se comparten entre instancias.

Fuera de un componente ColdFusion, puede usar cualquier nombre público (nombres que estarían disponibles dentro del componente en el alcance This) utilizando la notación struct. No puedes acceder a ningún nombre privado.

alcance El valor por defecto es siempre Variables - dentro de un componente, en las afueras de un componente, dentro de un UDF, dentro de un método de componentes, etc.

Tenga en cuenta que no hay tal cosa como una "memoria" ámbito. Hay llamados ámbitos, pero no alcances de memoria.

+1

Realmente buenos puntos de aclaración, gracias! –

2

Es posible que deba responder mi propia pregunta para que pueda encontrarla la próxima vez que la necesite aquí en StackOverflow. No soy positivo, pero creo que así es como se hace. (Como siempre, correcciones y sugerencias son bienvenidos!)

<cfcomponent> 
    <!--- Server Mode: production | development - used for differing paths and such ---> 
    <cfset variables.mode = "development"> 

    <cffunction name="init" access="public"> 
     <cfargument name="settings" type="struct" required="no"> 
     <cfset StructAppend(variables, arguments.settings)> 
     <cfreturn this> 
    </cffunction> 

    <cffunction name="getMode" access="public"> 
     <cfreturn variables.mode> 
    </cffunction> 

</cfcomponent> 

página de llamada:

<cfset c = createObject("component","myComponent").init()> 
<cfoutput> 
    <!--- Should output "development" ---> 
    #c.getMode()# 
</cfoutput> 
+0

Me gustaría enumerar los ajustes apoyados uno por uno con cfargument de, documentar lo que son con la indirecta = "", y luego la persona que llama puede utilizar init (ArgumentCollection =" # setting_struct # ") si hay muchos argumentos. Mejor documentación de esa manera. – Henry

7

sí, es el valor por defecto, el alcance variables.

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

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

Es una buena idea ubicar todas sus variables en las funciones de CFC.

No se olvide de output = "false", se reducirá una gran cantidad de espacios en blanco CF genera. Normalmente dejaré de lado access = "public" ya que es el predeterminado.

Si desea una mejor documentación cuando otros navegan a su CFC, incluso se puede considerar el uso de

<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> 
1
<cfcomponent> 
<cfset this.mode = "development"> 
</cfcomponent> 

página de llamada:

<cfset c = createObject("component","myComponent")> 
<cfoutput> 
#c.Mode# 
</cfoutput> 
+0

@cf_PhillipSenn - Creo que preguntaban por ámbitos que no son visibles fuera del cfc. – Leigh

+0

Ohhhh ... Tienes razón. Gracias por atrapar eso! –

Cuestiones relacionadas