Em um Coldfusion cfc, que é o escopo nome para o conjunto de variáveis fora de uma função?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Em um componente Coldfusion / CFC, eu quero adequadamente o âmbito de algumas variáveis para estar disponível para todas as funções contidas, mas para ser ocultos ou bloqueados todos de fora scripts.Qual é o nome do cfc memória do escopo?É 'variáveis'?Está disponível dentro de um contidas função?É bloqueado fora do cfc?

(Exemplos na CF 8)

Página de chamada:

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

Adicionais de práticas recomendadas sugestões são bem-vindas.Tem sido muito tempo desde que eu fiz isso.Obrigado antecipadamente.

Foi útil?

Solução

Dentro de um componente ColdFusion, todos os nomes públicos estão no This escopo e privado nomes estão no Variables âmbito de aplicação.Nomes que podem incluir tanto "normal" de propriedades da variável, bem como "UDF" métodos.Dentro de um componente ColdFusion, o This e Variables os escopos de são por instância e não são compartilhadas entre as instâncias.

Fora de um componente ColdFusion, você pode usar qualquer um público de nomes (nomes que estariam disponíveis dentro do componente na This âmbito de aplicação) usando a estrutura de notação.Você não pode acessar quaisquer nomes.

O escopo padrão é sempre Variables - dentro de um componente, fora de um componente, dentro de uma UDF, dentro de um método de componente, etc.

Observe que não há nenhuma tal coisa como uma "memória" de escopo.Há chamado escopos, mas não a memória escopos.

Outras dicas

Sim, é o padrão, as variáveis de escopo.

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

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

É uma boa idéia para o âmbito de todas as suas variáveis em cffunctions no CFC.

Não se esqueça de saída="false", ele cortou um monte de espaço em branco CF gera.Eu geralmente vai deixar de fora access="público" já que é o padrão.

Se você deseja melhorar a documentação, quando outros navegue para o CFC, você pode até considerar o 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>

Talvez eu tenha que responder a minha própria pergunta para que eu possa encontrá-lo na próxima vez que eu precisar dele aqui no StackOverflow.Eu não sou positivo, mas eu acho que isso é como ele é feito.(Como sempre, correções e sugestões são bem vindas!)

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

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

Página de chamada:

<cfset c = createObject("component","myComponent")>
<cfoutput>
#c.Mode#
</cfoutput>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top