2010-07-28 60 views
1

嗨我有一個名爲「tsks_Session」,執行會話任務的CFC /組件。在這個cfc/init()函數中,創建了一個包含應用程序中所需的所有變量的結構。一些變量是數組類型。結構'與'類型''陣列'的SESSION變量

<cfcomponent > 
     <cffunction name="init"> 
     <cfargument name="structKey" > 
     <cflock timeout="35" > 
     <cfset SESSION = structNew() > 
     <cfset SESSION.bar_code = "" > 
     <cfset SESSION.price = "" > 
     <cfset SESSION.pub_date = "01/01/1900" > 
     <cfset SESSION.author = ArrayNew() > 
     <cfset SESSION.title = ArrayNew() >  
     <cfset SESSION.[bar_code_subj_pric] = structNew() > <!--- key = concatanation of  
                  bar_code and price ---> 
     <cfset SESSION.[bar_code_subj_pric].author = ArrayNew() > 
     <cfset SESSION.[bar_code_subj_pric].title = ArrayNew() > 
     </cflock> 
     </cffunction> 
    <!---getter---> 
    <cffunction name="getAuthor" returntype="array" access="public" output="false"> 
     <cfscript>return SESSION.author; </cfscript> 
    </cffunction> 
    <!---setter:adding the Array/"author" to the structue/"SESSION.[bar_code_subj_pric]" ---> 
    <cffunction name="setAuthor" retuntype="void" access="public" output="false"> 
    <cfargument name="bar_code_subj_pric" type="string" required="true"> 
    <cfargument name="author" type="array" required="true"> 
    <cfset var q = "" > 
    <cfparam name="author" default="" > 
     <cfloop index="i" from="1" to="arrayLen(SESSION.[bar_code_subj_pric].author)"> 
     <cfset SESSION.author = ArrayAppend(SESSION.[bar_code_subj_pric].author,"#arguments.author#")> 
     </cfloop> 
    </cffunction> 

    <!---getter.title---> 
    <cffunction name="gettitle" returntype="array" access="public" output="false"> 
     <cfscript>return SESSION.title; </cfscript> 
    </cffunction> 
    <!---setter:adding the Array/"title" to the structue/"SESSION.[bar_code_subj_pric]" ---> 
    <cffunction name="settitle" retuntype="void" access="public" output="false"> 
    <cfargument name="bar_code_subj_pric" type="string" required="true"> 
    <cfargument name="title" type="array" required="true"> 
    <cfset var q = "" > 
    <cfparam name="title" default="" > 
     <cfloop index="i" from="1" to="arrayLen(SESSION.[bar_code_subj_pric].title)"> 
     <cfset SESSION.title = ArrayAppend(SESSION.[bar_code_subj_pric].title,"#arguments.title#")> 
     </cfloop> 
    </cffunction> 
    </cfcomponent> 

一個顯示頁上的1)中,具有instanitiated CFC中, 我創建了一個STR稱爲

<cfset str[expld133] =structnew()> 

當我輸出的功能setAuthor( 「expld133」,凱利)/的setTitle(「expld133 「,33.22),我得到"The value that i am not passing an array type". 請告訴我什麼是錯的?

2)我可以創建一個名爲「SESSION」的結構嗎?它是否安全?

3)有沒有錯誤的方式,我將2個不同的數組(作者/標題)添加到主結構「SESSION。[bar_code_subj_pric]」?

回答

3

對於問題#1,我認爲發生故障的線路可能是這兩種中的一種:

setAuthor("expId133", Kelly); 
setTitle("expId133", 33.22); 

兩種方法預期的陣列對象作爲第二參數;但是你在第一種情況下傳遞一個名爲「Kelly」的變量,而在第二種情況下傳遞一個數字。如果「Kelly」應該是值,而不是變量名,則必須引用它("Kelly"而不是Kelly),但這仍不是數組。如果你希望它是一個包含1個字符串「Kelly」的數組,那麼假設你使用的是CF8或更高版本,那麼你會通過["Kelly"]

對於問題2,您可以創建一個名爲「會話」變量(它將進入組件的變量的作用域),它是「安全」 ......但我會強烈建議反對。你只是想要混淆。此外,它(結構)不會存儲在會話範圍中(除非組件存儲在那裏)。爲什麼不使用會話範圍?爲什麼要創建一個名爲「SESSION」的新結構?

對於問題3,我不確定這是否是有效的語法,但我猜不是。試試下面這些:

SESSION[bar_code_subj_pric] = foo; 

這將使用bar_code_subj_pric作爲一個變量,它的價值將是結構的鍵名。所以,如果bar_code_subj_pric計算結果爲4,則整個語句的計算結果爲:session.4 = foo;

在另一方面,這種代碼:

SESSION.bar_code_subj_pric = foo; 
//this is also equivalent to: 
//SESSION["bar_code_subj_pric"] = foo; 

...創建了一個名爲「bar_code_subj_pric」有值的SESSION結構的關鍵foo變量/對象。