2009-12-17 12 views
7

Trong thành phần Coldfusion/CFC, tôi muốn điều chỉnh đúng một số biến để có sẵn cho tất cả các hàm được chứa, nhưng bị ẩn hoặc bị chặn từ các tập lệnh bên ngoài. Tên của phạm vi bộ nhớ của cfc là gì? Có phải 'biến'? Là có sẵn bên trong một chức năng chứa? Nó có bị chặn từ bên ngoài cfc không?Trong cfc Coldfusion, tên phạm vi cho các biến được đặt bên ngoài một hàm là gì?

(ví dụ trong CF 8)

trang Calling:

<cfset settings = structNew()> 
<cfset util = createObject("component", "myUtils").init(settings)> 
<cfoutput> 
    #util.myFunction()# 
</cfoutput> 

myUtils.cfc:

<cfcomponent> 
<!--- Need to set some cfc global vars here ---> 

    <cffunction name="init" access="public"> 
     <cfargument name="settings" type="struct" required="no"> 
     <!--- I need to merge arguments.settings to the cfc global vars here ---> 
     <cfreturn this> 
    </cffunction> 

    <cffunction name="myFunction" access="public"> 
     <cfset var result = ""> 
     <!--- I need to access the cfc global vars here for init settings ---> 
     <cfreturn result> 
    </cffunction> 
</cfcomponent> 

bổ sung gợi ý thực hành tốt nhất được hoan nghênh. Nó đã được khá một thời gian kể từ khi tôi đã làm điều này. Cảm ơn trước.

Trả lời

14

Trong thành phần ColdFusion, tất cả các tên công cộng trong phạm vi This và tất cả các tên tư nhân trong phạm vi Variables . Các tên có thể bao gồm cả các thuộc tính biến "bình thường" cũng như các phương thức "UDF". Trong thành phần ColdFusion, các phạm vi ThisVariablesmỗi trường hợp và không được chia sẻ giữa các phiên bản.

Bên ngoài thành phần ColdFusion, bạn có thể sử dụng bất kỳ tên công khai nào (tên sẽ có sẵn trong thành phần trong phạm vi This) bằng cách sử dụng ký pháp struct. Bạn không thể truy cập bất kỳ tên riêng nào.

phạm vi Giá trị mặc định luôn là Variables - trong phạm vi một thành phần, bên ngoài của một thành phần, trong vòng một UDF, trong vòng một phương pháp thành phần vv

Lưu ý rằng không có những điều như một "bộ nhớ" phạm vi. Có có tên là phạm vi, nhưng không phải phạm vi bộ nhớ.

+1

Làm rõ điểm tốt, cảm ơn! –

2

Tôi có thể phải trả lời câu hỏi của riêng mình để tôi có thể tìm thấy câu hỏi đó vào lần tiếp theo tôi cần ở đây trên StackOverflow. Tôi không tích cực, nhưng tôi nghĩ rằng đây là cách nó được thực hiện. (Như mọi khi, điều chỉnh và đề nghị được hoan nghênh!)

<cfcomponent> 
    <!--- Server Mode: production | development - used for differing paths and such ---> 
    <cfset variables.mode = "development"> 

    <cffunction name="init" access="public"> 
     <cfargument name="settings" type="struct" required="no"> 
     <cfset StructAppend(variables, arguments.settings)> 
     <cfreturn this> 
    </cffunction> 

    <cffunction name="getMode" access="public"> 
     <cfreturn variables.mode> 
    </cffunction> 

</cfcomponent> 

trang Calling:

<cfset c = createObject("component","myComponent").init()> 
<cfoutput> 
    <!--- Should output "development" ---> 
    #c.getMode()# 
</cfoutput> 
+0

tôi sẽ ra khỏi danh sách các thiết lập được hỗ trợ từng người một với cfargument của, tài liệu những gì họ đang có gợi ý = "", và sau đó người gọi có thể sử dụng init (ArgumentCollection =" # setting_struct # ") nếu có nhiều đối số. Tài liệu tốt hơn theo cách đó. – Henry

7

Vâng, đó là mặc định, phạm vi biến.

<cfcomponent output="false"> 
    <cfset variables.mode = "development"> 

    <cffunction name="getMode" output="false"> 
     <cfreturn variables.mode> 
    </cffunction> 
</cfcomponent> 

Bạn nên cân nhắc tất cả các biến trong cffunctions trong CFC.

Đừng quên đầu ra = "sai", nó sẽ cắt giảm rất nhiều khoảng trắng CF tạo ra. Tôi thường sẽ thoát khỏi truy cập = "công khai" vì đó là mặc định.

Nếu bạn muốn tài liệu tốt hơn khi những người khác duyệt để CFC, bạn thậm chí có thể xem xét sử dụng

<cfcomponent output="false"> 
    <cfproperty name="mode" type="string" default="development" hint="doc..."> 

    <cfset variables.mode = "development"> 

    <cffunction name="getMode" output="false"> 
     <cfreturn variables.mode> 
    </cffunction> 
</cfcomponent> 
1
<cfcomponent> 
<cfset this.mode = "development"> 
</cfcomponent> 

trang Calling:

<cfset c = createObject("component","myComponent")> 
<cfoutput> 
#c.Mode# 
</cfoutput> 
+0

@cf_PhillipSenn - Tôi tin rằng họ đã hỏi về các phạm vi được hiển thị bên ngoài cfc. – Leigh

+0

Ohhhh ... Bạn nói đúng. Cảm ơn vì đã bắt được điều đó! –