2014-02-18 44 views
4

今天我遇到了一個有趣的場景,使用StructCopy和URL範圍。Coldfusion的StructCopy&URL範圍

我不是在尋找答案如何繞過它 - 我知道/已使用structAppend /複製等

我想的URL範圍複製到一個新的結構,所以我可以處理/改變它不會影響URL範圍本身,所以我使用了structCopy(url)。我知道structcopy是結構的淺表副本,但是因爲我的url範圍只包含url參數(據我所知 - 這是正確的嗎?他們都是我對這種情況感興趣的),它們是字符串鍵/值那麼我認爲淺拷貝就足夠了(字符串是不可變的,所有的)。

但是,當複製URL作用域時,會產生奇怪的行爲 - 看起來好像structCopy(url)只是返回url範圍 - 不是它的副本,不是錯誤。例如,如果我執行以下(假設我有網址查詢參數,其中包括一個叫做「搶」:

<cfset local.clonedUrl = structCopy(url) /> 
<cfdump var="#local.clonedUrl#"> 
<cfdump var="#url#"> 
<cfset structDelete(local.clonedUrl, "rob") /> 
<cfdump var="#local.clonedUrl#"> 
<cfdump var="#url#"> 

在上述情況下,該結構後刪除通話時,clonedUrl和URL都兩人都進入刪除(顯然,與正常創建結構進行以上,而不是擺在首位URL正確行爲)

所以,我的問題是:

  1. 我所看到的是,URL範圍實際上是coldfusions URLScope類的一個實例,所以也許trea出於這個原因不同,但是從structCopy調用返回同一個實例只是意味着什麼。至少如果它不能做到這一點,我會期待一個錯誤,而不是一個看起來非常類似於預期的結果,但實際上正是我想要避免的行爲。還注意到,如果我將一個組件傳遞給structCopy,它看起來有相似的結果。

  2. 什麼是URLScope - 它是否擴展了Struct?當我轉儲類名時,我發現它是一個URLScope,但是隻是傾倒對象就像它會對Struct進行轉儲。任何人都有任何建議來查看對象的源代碼或至少一個API/Javadocs類型規範?

我使用CF10(我不是在尋找答案如何繞過它 - 我知道/已使用structAppend /複製等)

+1

_「任何人都有任何建議來查看對象的源代碼」_ - CF是專有的;源代碼不可用。 (這顯然是去年發生的一次攻擊,但我沒有看到它實際上在任何地方都可用。)你當然可以查看[Railo source](https://github.com/getrailo/railo/) - 你應該檢查那裏看看行爲是否一樣? –

+0

謝謝,這是一個無法訪問代碼的恥辱 - 即使只是一些詳細的API規範/類heirarchy會很好。現在請看一下Railo的來源。 – rhinds

+0

有幾個地方的ColdFusion結構的行爲不像其他結構 - 曾經嘗試覆蓋CGI範圍中的值?我會冒險猜測FORM範圍中存在的行爲與您在URL範圍中看到的行爲相同。每當我需要像你描述的功能時,我只需使用'duplicate()'並完成它。 –

回答

1

感謝您的意見鄉親 - 結論是請不要將StructCopy()與URL對象(可能位於Form範圍對象等)中使用。這是非常嚴峻的,但URL在技術上並不是一個結構,所以所有的投注都關閉。 (I moan some more here