7

Coldfusion コンポーネント/CFC では、含まれるすべての関数で使用できるようにいくつかの変数を適切にスコープしたいのですが、外部スクリプトからは非表示またはブロックしたいと考えています。cfc のメモリ スコープの名前は何ですか? 「変数」ですか?それは含まれている関数内で利用できますか? CFCの外からブロックされていますか?

(CF 8 の例)

呼び出しページ:

<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>

追加のベスト プラクティスの提案を歓迎します。私がこれをやったのはかなり久しぶりです。前もって感謝します。

4

4 に答える 4

14

ColdFusion コンポーネント内では、すべてのパブリック名がThisスコープ内にあり、すべてのプライベート名がVariablesスコープ内にあります。名前には、「通常の」変数プロパティと「UDF」メソッドの両方を含めることができます。ColdFusion コンポーネント内では、ThisおよびVariablesスコープはインスタンスごとであり、インスタンス間で共有されません。

ColdFusion コンポーネントの外部では、構造体表記を使用して任意のパブリック名 (Thisスコープ内のコンポーネント内で使用できる名前) を使用できます。個人名にはアクセスできません。

デフォルトのスコープは常にVariables- コンポーネント内、コンポーネント外、UDF 内、コンポーネント メソッド内などです。

「メモリ」スコープのようなものはないことに注意してください。名前付きスコープはありますが、メモリ スコープはありません。

于 2009-12-17T20:23:25.277 に答える
7

はい、デフォルトの変数スコープです。

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

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

CFC の cffunctions ですべての変数のスコープを設定することをお勧めします。

output="false" を忘れないでください。これにより、CF が生成する多くの空白が削減されます。access="public" がデフォルトであるため、通常は省略します。

他の人があなたの CFC をブラウズするときに、より良いドキュメントが必要な場合は、使用を検討することもできます。

<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>
于 2009-12-17T20:18:31.977 に答える
3

次に StackOverflow で必要になったときに見つけられるように、自分の質問に答える必要があるかもしれません。私は肯定的ではありませんが、これがその方法だと思います。(いつものように、修正と提案は大歓迎です!)

<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>

呼び出しページ:

<cfset c = createObject("component","myComponent").init()>
<cfoutput>
    <!--- Should output "development" --->
    #c.getMode()#
</cfoutput>
于 2009-12-17T20:09:34.773 に答える
1
<cfcomponent>
<cfset this.mode = "development">
</cfcomponent>

呼び出しページ:

<cfset c = createObject("component","myComponent")>
<cfoutput>
#c.Mode#
</cfoutput>
于 2009-12-19T19:30:24.257 に答える