2009-07-17 8 views
3

Par défaut, ColdFusion transmet des types simples (tels que numérique, chaîne et GUID) par valeur aux fonctions. Je voudrais passer un type simple par référence.Puis-je transmettre une valeur simple par référence dans ColdFusion?

J'emballe actuellement une valeur simple dans une structure (ils sont passés par référence). Cela résout mon problème, mais il est très laid:

<!--- TheFunctionName----> 
<cffunction name="TheFunctionName"> 
    <cfargument name="OutVariable" type="struct"> 
    <cfset OutVariable.ID = 5> 
</cffunction> 

<cfset OutVariable=StructNew()> 
<cfset TheFunctionName(OutVariable)> 

<!--- I want this to output 5---> 
<cfoutput>#OutVariable.ID#</cfoutput> 

je préfère quelque chose comme ceci:

<!--- TheFunctionName----> 
<cffunction name="TheFunctionName"> 
    <cfargument name="OutVariable" passbyref="true"> 
    <cfset OutVariable = 5> 
</cffunction> 

<cfset TheFunctionName(OutVariable)> 

<!--- I want this to output 5---> 
<cfoutput>#OutVariable#</cfoutput> 

Répondre

8

AFAIK, il n'y a aucun moyen de transmettre des valeurs simples par référence dans ColdFusion. La seule solution à laquelle je peux penser est celle que vous utilisez déjà. Au lieu de cela, je suggère d'essayer de restructurer votre programme pour travailler avec le grain de la langue. Dans les cas où il n'y a qu'une seule valeur simple à « modifier », vous pouvez simplement faire de votre fonction retourne la nouvelle valeur, et l'appeler comme:

<cfset SomeVar = TheFunctionName(SomeVar)> 

Dans le cas où vous modifiez plusieurs valeurs, prendre un peu de recul et réfléchissez à la possibilité de regrouper ces multiples valeurs en CFC, vos fonctions mutantes devenant des méthodes de la CFC. Cela pourrait être une solution plus claire et plus facile à maintenir de toute façon.

1

Vous pouvez faire en sorte que les variables utilisées à l'extérieur et à l'intérieur de la fonction se trouvent dans une étendue qui existe dans les deux zones de code. Par exemple, si vous mettez une variable dans la portée "session" ou "demande", vous pourrez y accéder depuis la fonction. Les modifications apportées persisteront.

Notez que lorsque vous faites cela, vous ne "passez" pas les variables à la fonction. La fonction suppose simplement que la variable existe ou la crée, selon la façon dont vous la codez.

<cffunction name="TheFunctionName"> 
    <cfset Request.StrVar = "inside function<br />" /> 
</cffunction> 

<cfscript> 
    Request.StrVar = "outside function<br />"; 
    WriteOutput(Request.StrVar); 
    TheFunctionName(); 
    WriteOutput(Request.StrVar); 
</cfscript> 

About ColdFusion Scopes

En cas de doute sur la page d'appel déclarant la variable à l'avance quand il est nécessaire, vous devrez faire des démarches avec la balise <cfparam> ou IsDefined() fonction.

1

Si vous:

  1. déclare la fonction à l'intérieur d'un CFC
  2. appeler la fonction à l'aide <cfinvoke>

Vous seriez en mesure de spécifier le paramètre <cfinvoke> "ReturnVariable" , puis affichez cette variable comme bon vous semble.

<cfinvoke component="this" method="TheFunctionName" returnvariable="blah"> 
    <cfinvokeargument name="data" value="whatever" type="string"> 

    <cfreturn data> 
</cfinvoke> 

<cfdump var="#blah#"> 

Si vous écrivez tout dans cfscript, alors je voudrais aller avec ce que dit SurroundedByFish.

Questions connexes