In un cfc Coldfusion, qual è il nome possibilità di variabili impostate al di fuori di una funzione?

StackOverflow https://stackoverflow.com/questions/1924121

  •  20-09-2019
  •  | 
  •  

Domanda

In un componente Coldfusion / CFC, voglio correttamente portata alcune variabili per essere disponibile per tutte le funzioni contenute, ma di essere nascosto o bloccato da script esterni. Qual è il nome del campo di applicazione della memoria del CFC? E ' 'variabili'? È che a disposizione all'interno di una funzione contenuta? E 'bloccato da fuori cfc?

(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. E 'passato un bel po' che ho fatto questo. Grazie in anticipo.

È stato utile?

Soluzione

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 "normale" proprietà delle variabili, nonché i metodi "FSU". All'interno di un componente ColdFusion, gli scopi e This Variables sono per-esempio 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 del perimetro This) utilizzando la notazione struct. L'utente non può accedere a tutti i nomi privati.

L'ambito 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, etc

Si noti che non v'è alcuna cosa come un ambito di "memoria". Ci sono nome scopi, ma non gli ambiti di memoria.

Altri suggerimenti

Sì, è il campo di applicazione di default, le variabili.

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

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

E 'una buona idea quella di ambito tutte le variabili in cffunctions in CFC.

Non dimenticare di output = "false", che taglierà giù un sacco di CF spazi genera. Io di solito lascerò fuori accesso = "pubblico", in quanto questo è 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>

io possa avere a rispondere alla mia domanda in modo che posso trovare la prossima volta ho bisogno qui su StackOverflow. Io non sono positivi, ma penso che questo è come è fatto. (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>
<cfcomponent>
<cfset this.mode = "development">
</cfcomponent>

pagina chiamante:

<cfset c = createObject("component","myComponent")>
<cfoutput>
#c.Mode#
</cfoutput>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top