2014-04-16 5 views
7

Unten ist der Codeblock, den ich benutze.Verwechslung beim Zugriff auf dynamische Variablen in ColdFusion

<cfset variables.test1 = 'interface.temp1'> 
<cfset variables.test2 = 'interface.temp2'> 
<cfset variables.test3 = 'variables.' & variables.test2> 
<cfset variables["#variables.test1#"] = 23> 
<cfset "#variables.test3#" = 50> 

<cfdump var="#variables#"> 
<cfdump var="#variables['interface.temp1']#"> 

Das angehängte Bild beschreibt die Ausgabe, die ich bekomme. Der erste cfdump zeigt den Wert "interface.temp1" als "undefiniert" an und im zweiten cfdump zeigt er den Wert als "23" an. Wenn Sie sich auch den ersten cfdump ansehen, werden alle Variablen im VARIABLES-Bereich angezeigt, aber es gibt keine Variable mit dem Wert "23" und im zweiten cfdump von wo erhält sie den Wert "23"?

Bitte helfen Sie mir, die Ursache dafür zu kennen.

+1

Die Ausgabe, die Sie oben veröffentlichten, ist nicht die Ausgabe, die ich bekomme, wenn ich diesen Code auf CF9 führe. Alles funktioniert wie erwartet für mich (versuchen Sie es auf cflive.net) –

+0

Welche Version von CF laufen Sie? –

+0

@Michael Giovanni Pumo, Ich benutze CF9 –

Antwort

2

Ich habe es geknackt. Ich schreibe es vollständig auf meinem Blog: "Odd behaviour with struct keys with dots in their names".

Grundsätzlich, sobald Sie haben eine substruct interface genannt, die - wie @Leigh sagte - durch diese erstellt:

<cfset "#variables.test3#" = 50> 

Dann Coldfusion (und FWIW, Railo), verwirrt, wenn sie versuchen Strukturschlüssel zu lösen die mit interface. vorangestellt sind: Sie sieht diese Referenzen als Verweise auf Schlüssel innerhalb der interface Substruktur und nicht einfach als Schlüsselnamen.

Wenn Sie diese Codezeile nicht oben haben, ist CF in der Lage, den Wert des punktierten Schlüssels gut zu sehen.

+0

Ah, Sie haben Recht. Das ist ein interessanter Fall. Normalerweise verwende ich die Array-Notation, wenn Variablennamen vom Geraden und Schmalen abweichen (Alpha/numerisch/Unterstrich), also bin ich nicht auf diesen Namen gestoßen. Ehrlich gesagt bin ich mir nicht sicher, ob der Ausdruck "st.prefix.key2" * funktionieren sollte. Wenn diese Syntax erlaubt wird, führt dies zu Mehrdeutigkeiten, da es nahezu unmöglich ist, zwischen einem einfachen Schlüssel namens 'prefix.key2' und einer Struktur namens' prefix', die 'key2' enthalten, zu unterscheiden. dh 'st ['prefix.key2'] und st = {prefix = {key2 =" aaa "}}' – Leigh

Verwandte Themen