2009-07-17 10 views
3

Standardmäßig übergibt ColdFusion einfache Typen (wie numerisch, Zeichenfolge und GUID) nach Wert an Funktionen. Ich möchte einen einfachen Typ als Referenz übergeben.Kann ich einen einfachen Wert als Referenz in ColdFusion übergeben?

Ich wickle derzeit einen einfachen Wert in einer Struktur (sie werden durch Verweis übergeben). Das löst mein Problem, aber es ist sehr hässlich:

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

Ich würde eher so etwas wie diese:

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

Antwort

8

AFAIK, es gibt keine Möglichkeit in Coldfusion einfache Werte durch Verweis übergeben. Die einzige Problemumgehung, an die ich denken kann, ist die, die Sie bereits verwenden.

Stattdessen würde ich empfehlen, Ihr Programm so zu strukturieren, dass es mit der Sprache der Sprache funktioniert. In Fällen, in denen es nur einen einfachen Wert zu „modifizieren“, könnten Sie einfach Ihre Funktion den neuen Wert machen zurückzukehren, und nennen Sie es mögen:

<cfset SomeVar = TheFunctionName(SomeVar)> 

In Fällen, in denen Sie mehrere Werte sind zu modifizieren, einen Schritt zurück und überlegen Sie, ob es möglich ist, diese mehreren Werte zu einem CFC zu bündeln, wobei Ihre Mutatorfunktionen Methoden des CFC werden. Dies könnte auf jeden Fall eine klarere und wartungsfreundlichere Lösung sein.

1

Sie können veranlassen, dass die außerhalb und innerhalb der Funktion verwendeten Variablen in einem Bereich liegen, der in beiden Codebereichen vorhanden ist. Wenn Sie beispielsweise eine Variable in den Bereich "Sitzung" oder "Anforderung" einfügen, können Sie von der Funktion aus darauf zugreifen. Die vorgenommenen Änderungen bleiben erhalten.

Beachten Sie, dass wenn Sie dies tun, Sie tatsächlich die Variablen nicht an die Funktion übergeben. Die Funktion geht davon aus, dass die Variable existiert oder erstellt sie, je nachdem, wie Sie es kodieren.

<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

Wenn es irgendeinen Zweifel an der anrufenden Seite ist die Variable im Voraus zu erklären, wenn es erforderlich ist, Sie mit dem <cfparam> Tag oder IsDefined() Funktion etwas Zuarbeit zu tun haben werde.

1

Wenn Sie:

  1. die Funktion innerhalb eines CFC erklären
  2. die Funktion aufrufen, indem <cfinvoke>

Sie in der Lage sein würde, die <cfinvoke> Parameter "return" angeben , und geben Sie dann diese Variable aus, wie Sie möchten.

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

    <cfreturn data> 
</cfinvoke> 

<cfdump var="#blah#"> 

Wenn Sie alles in cfscript schreiben, dann würde ich mit dem gehen, was SurroundedByFish sagte.

Verwandte Themen