2009-12-17 3 views
7

In un componente/CFC Coldfusion, desidero circoscrivere correttamente alcune variabili affinché siano disponibili per tutte le funzioni contenute, ma per essere nascoste o bloccate da script esterni. Qual è il nome dell'ambito di memoria di cfc? Sono 'variabili'? È disponibile in una funzione contenuta? È bloccato dall'esterno del cfc?In un cfc Coldfusion, qual è il nome dell'ambito per le variabili impostate al di fuori di una funzione?

(Esempi in CF 8)

pagina chiamante:

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

Ulteriori suggerimenti di buone pratiche vengono accolti. È passato parecchio tempo da quando l'ho fatto. Grazie in anticipo.

risposta

14

all'interno di un componente ColdFusion, tutti i nomi pubblici sono nel campo di applicazione This e tutti i nomi private sono nel campo di applicazione Variables . I nomi possono includere sia le proprietà delle variabili "normali" che i metodi "UDF". All'interno di un componente ColdFusion, gli ambiti This e Variables sono per istanza e non sono condivisi tra le istanze.

Al di fuori di un componente ColdFusion, è possibile utilizzare qualsiasi nome pubblico (nomi che sarebbero disponibili all'interno del componente nello scope This) utilizzando la notazione della struttura. Non è possibile accedere a nomi privati.

portata Il valore predefinito è sempre Variables - all'interno di un componente, al di fuori di un componente, all'interno di un'UDF, all'interno di un metodo componente, ecc

Si noti che non v'è alcuna cosa come un ambito di "memoria". Esistono gli ambiti denominati, ma non gli ambiti di memoria.

+1

Buoni punti chiari, grazie! –

2

Potrei dover rispondere alla mia domanda in modo che possa trovarla la prossima volta che ne ho bisogno qui su StackOverflow. Non sono positivo, ma penso che sia così. (Come sempre, correzioni e suggerimenti sono ben accetti!)

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

pagina chiamante:

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

vorrei elencare le impostazioni supportate uno ad uno con cfargument di, documentare quello che sono con suggerimento = "", e quindi il chiamante può usare init (ArgumentCollection =" # setting_struct # ") se ci sono molti argomenti. Migliore documentazione in questo modo. – Henry

7

Sì, è il default, la portata delle variabili.

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

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

È buona norma applicare tutte le variabili in cffunctions in CFC.

Non dimenticare output = "false", ridurrà un sacco di spazio bianco generato da CF. Di solito tralascio access = "public" dato che è il default.

Se si desidera una migliore documentazione quando gli altri individuare il CFC, si può anche considerare l'utilizzo di

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

pagina chiamante:

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

@cf_PhillipSenn - Credo che stessero chiedendo degli ambiti che non sono visibili al di fuori di cfc. – Leigh

+0

Ohhhh ... Hai ragione. Grazie per averlo capito! –