В чем разница между использованием CFINVOKE и CreateObject для запуска функции компонента?
-
25-09-2019 - |
Вопрос
В коде моей компании я часто видел компонентные файлы, используемые путем инициализации объекта этого компонента и вызова методов от объекта. Однако мне кажется несколько простым, чтобы использовать метод CFINVOKE, особенно при использовании одного метода из компонентного файла. Каковы различия между этими 2 методами вызова функции компонента и какие плюсы / минусы каждого? Когда я должен использовать какой?
Решение
CFINVOOKE можно использовать только в тегах.
CreateObject можно использовать в обоих тегах и CFScript и имеет тенденцию быть немного сложнее / легче читать IMO.
До недавнего времени я избегал использовать CFINVOKE, потому что я нашел его «громоздким», но про прочем вы можете динамически петли по методам в CFC. В CreateObject вы не можете.
Таким образом, если бы, например, у меня есть CFC, который имеет методы - метод1, метод2, метод3, метод4. Я могу зацикливаться над ними, как так: -
<cfloop from="1" to="4" index="element">
<cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
</cfif>
--
Другое, что следует отметить, что некоторые совместные хосты блокируются на CreateObject. В основном из-за доступа это дает подчеркивание Java.
Другие советы
Одно другое преимущество использования createObject()
это то, что вы можете цепить init()
Метод, например
<cfset myObject = createObject("com.path.MyObject").init() />
И если ваш init()
возвращается this
Вы можете пойти дальше и цепотать метод, если вам не нужно снова использовать объект:
<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />
Стоит указать, что в CF 9 вы можете использовать новый (Ahem) new
Синтаксис для создания объектов. Например, чтобы создать тот же объект, что и выше и позвоните, это init()
Я могу написать:
<cfset myObject = new com.path.MyObject() />
Это аккуратно, и мне нравится возможность сделать это. CF движется в правильном направлении, на мой взгляд с такими функциями.
Вы почти ответили на него сами: на поверхности можно сказать, что если вы будете вызывать только один метод на странице, то делая в одном падении в CFINVOOKE (что касается CFC и вызывает один по имени) Отказ И, безусловно, если вы будете звонить более одного метода CFC на странице, то отделяя шаги, имеет смысл (создать смысл CFC с функцией CREATEOBJECT или CFOBJECT TAG, затем вызывать методы, на которые можно найти в этом объекте, указатель на CFC) Так что вы не платите эту атмосферу стоить более одного раза.
Но имейте в виду, что если страница часто называется, это может иметь смысл также сохранить этот результат создания CFC, так что его можно повторно использовать в последующем запросе на страницу. Вы сделаете это, хранив его (результат CFObject / CreateObject), а не в локальной переменной, а вместо этого в общем объеме: будь то сервер, приложение или сеанс, основываясь на «кто» из такого повторного использования. Конечно, тогда он действует на вас программно обрабатывать / решить, сколько времени сохранить этот «кэшированный» экземпляр CFC.
Как важно, когда вы сохраняете экземпляр CFC таким образом, вы становитесь более восприимчивыми к «BUG VAR Case Bug», что в основном заключается в том, что вы должны быть более осторожны, чтобы важен, в котором в основном вы должны быть более осторожны, чтобы набрать любые локальные переменные, которые вы создаете в CFC. Вместо того, чтобы попытаться уточнить это, я укажу на мета-ресурс, который я создал на этом:
http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem.
Надеюсь, это поможет.
Скорее, повторите эту дискуссию, я просто уйду тебе в Google:
http://www.google.com/search?q=cfinvoke+vs+createobject
Есть некоторые тонкие различия (т.е. <cfinvoke>
способен обращаться с именами динамического метода), но по сути, это просто сводится к личным предпочтениям. Ну, это и тот факт, что вы не можете использовать <cfinvoke>
через <cfscript>
.