2014-04-16 17 views
7

Poniżej znajduje się blok kodu, którego używam.Błąd w dynamicznym dostępie zmiennym w 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']#"> 

Załączony obraz opisuje wyjście, otrzymuję. Pierwszy cfdump wyświetla wartość "interface.temp1" jako "undefined", aw drugim cfdump wyświetla wartość jako "23". Jeśli spojrzysz również na pierwszy plik cfdump, wyświetla on wszystkie zmienne w zakresie ZMIENNE, ale nie ma zmiennej o wartości "23", a następnie w drugiej cfdump skąd pobiera wartość "23"?

Proszę mi pomóc poznać przyczynę tego.

+1

Dane wyjściowe zamieszczone powyżej nie są danymi wyjściowymi uzyskanymi podczas uruchamiania tego kodu w systemie CF9. Wszystko działa zgodnie z oczekiwaniami (spróbuj na cflive.net). –

+0

Jaką wersję CF używasz? –

+0

@Michael Giovanni Pumo, używam CF9 –

Odpowiedz

2

mam pęknięty go. Piszę to w całości na moim blogu: "Odd behaviour with struct keys with dots in their names".

Zasadniczo raz masz substruct nazwie interface, która jest - jak powiedział @Leigh - Utworzone przez to:

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

Następnie ColdFusion (a FWIW, Railo), pomylić, gdy próbuje rozwiązać klawiszy struct które są poprzedzone prefiksem interface.: widzi te odniesienia jako odwołania do kluczy w podstrukturze interface, a nie po prostu nazwy kluczy.

Jeśli nie masz powyższej linii kodu powyżej, to CF może zobaczyć wartość kropkowo-kluczową po prostu dobrze.

+0

Ach, masz rację. To jest interesujące. Zwykle używam notacji tablicowej, gdy zmienne nazwy zmieniają się z prostej i wąskiej (alfa/cyfra/podkreślenie), więc nie natknąłem się na tę. Szczerze mówiąc, nie jestem pewien, czy wyrażenie 'st.prefix.key2' * powinno * działać. Dopuszczenie tej składni wprowadza niejasności, ponieważ byłoby prawie niemożliwe odróżnienie prostego klucza o nazwie 'prefix.key2' od struktury o nazwie' prefix', zawierającej 'klucz2'. tj. 'st ['prefix.key2'] i st = {prefix = {key2 =" aaa "}}' – Leigh

Powiązane problemy