В компоненте Coldfusion / CFC, я хочу правильно определить объем некоторых переменных, чтобы быть доступным для всех содержавших функций, но быть скрытым или заблокированным из внешних сценариев. Каково название объема памяти cfc? Это - 'переменные'? Это доступно в содержавшей функции? Это заблокировано снаружи cfc?
(Примеры в CF 8)
Страница 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>
Одобрены дополнительные предложения лучшей практики. Это было долгое время, так как я сделал это.Заранее спасибо.
В компоненте ColdFusion все общедоступные имена находятся в области This
, а все частные имена находятся в области Переменные
область видимости. Имена могут включать как «обычные» свойства переменных, так и методы «UDF». В компоненте ColdFusion области This
и Переменные
относятся к для каждого экземпляра и не используются совместно между экземплярами.
Вне компонента ColdFusion, вы можете использовать любые публичные имена (имена, которые будут доступны в компоненте в области This
), используя нотацию структуры. Вы не можете получить доступ к каким-либо частным именам.
Область действия по умолчанию всегда Переменные
- внутри компонента, вне компонента, внутри UDF, внутри метода компонента и т. Д.
Обратите внимание, что там нет такой вещи, как "память". Есть именованных областей, но нет областей памяти.
<cfcomponent>
<cfset this.mode = "development">
</cfcomponent>
Страница вызова:
<cfset c = createObject("component","myComponent")>
<cfoutput>
#c.Mode#
</cfoutput>
Возможно, мне придется ответить на свой вопрос, чтобы найти его в следующий раз, когда он мне понадобится здесь, в 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>
Да, это область видимости переменных по умолчанию.
<cfcomponent output="false">
<cfset variables.mode = "development">
<cffunction name="getMode" output="false">
<cfreturn variables.mode>
</cffunction>
</cfcomponent>
Это хорошая идея, чтобы охватить все ваши переменные в cffunctions в CFC.
Не забудьте 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>