In meinem Firmencode habe ich oft gesehen, dass Komponentendateien verwendet wurden, indem ein Objekt dieser Komponente initialisiert und die Methoden vom Objekt aufgerufen wurden. Es scheint mir jedoch etwas einfacher zu sein, die cfinvoke-Methode zu verwenden, insbesondere wenn nur eine Methode aus der Komponentendatei verwendet wird. Was sind die Unterschiede zwischen diesen beiden Methoden zum Aufruf einer Komponentenfunktion und was sind die Vor-/Nachteile von jedem? Wann sollte ich welche verwenden?Was ist der Unterschied zwischen der Verwendung von cfinvoke und createObject zum Ausführen einer Komponentenfunktion?
Antwort
cfinvoke kann nur in Tags verwendet werden.
createObject kann in beiden Tags & cfscript verwendet werden und neigt dazu, ein wenig schlanker/einfacher IMO zu lesen.
Bis vor kurzem habe ich vermieden, cfinvoke zu verwenden, weil ich es "sperrig" fand, aber ein Vorteil davon ist, dass Sie die Methoden innerhalb eines CFC dynamisch durchlaufen können. In createobject können Sie nicht.
Also wenn ich zum Beispiel einen CFC habe, der die Methoden hat - method1, method2, method3, method4. Ich kann über sie Schleife wie folgt: -
<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>
-
andere Sache zu beachten ist, dass einige Sharing-Hosts auf Create sperren. Vor allem wegen des Zugriffs auf das unterzeichnende Java.
Sie haben es fast selbst beantwortet: oberflächlich könnte man sagen, wenn Sie nur eine Methode auf einer Seite aufrufen, dann CFINVOKE (das den CFC instanziiert und den einen nennt) Methode) Sinn machen. Und sicherlich, wenn Sie mehr als eine Methode des CFC auf einer Seite aufrufen würden, dann macht das Trennen der Schritte Sinn (instanziieren Sie den CFC mit der createobject-Funktion oder dem cfobject-Tag, rufen Sie dann Methoden wie in diesem Objekt auf, einen Zeiger auf den CFC) , damit Sie diese Instanziierung nicht mehr als einmal bezahlen müssen.
Beachten Sie jedoch, dass es sinnvoll sein kann, das Ergebnis der Instanziierung des CFCs auch dann zu speichern, wenn die Seite häufig aufgerufen wird, damit es bei einer nachfolgenden Anforderung der Seite wiederverwendet werden kann. Sie würden dies tun, indem Sie es (das Ergebnis von cfobject/createobject) nicht in einer lokalen Variablen, sondern in einem freigegebenen Bereich speichern: Ob Server, Anwendung oder Sitzung, basierend auf "Wer" würde von einer solchen Wiederverwendung profitieren. Es liegt dann natürlich an Ihnen, programmatisch zu entscheiden, wie lange diese "Cached" CFC-Instanz gespeichert werden soll.
Wie wichtig, wenn Sie eine CFC-Instanz auf diese Weise speichern, werden Sie anfälliger für den "var scope bug", was bedeutet, dass Sie VAR alle lokalen Variablen, die Sie im CFC erstellen, noch vorsichtiger machen müssen. Anstatt versuchen, mehr dazu zu erarbeiten, werde ich mich, dass erstellt eine Meta-Ressource hinweisen:
http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem
Hoffnung, das hilft.
Vielmehr dann diese Diskussion wieder aufzuwärmen Ich werde dich nur auf Google verweisen:
http://www.google.com/search?q=cfinvoke+vs+createobject
Es gibt einige feine Unterschiede (IE: <cfinvoke>
ist in der Lage dynamische Methode Namen der Handhabung), aber im Wesentlichen läuft es gerade nach unten nach persönlicher Vorliebe. Nun, das und die Tatsache, dass Sie <cfinvoke>
über <cfscript>
nicht verwenden können.
Kein Grund, kurze URLs hier zu verwenden. Aktualisiert, um nur auf das ultimative Ziel zu zeigen. ;) –
Ich kopierte direkt von Google mit dem ganzen anderen irrelevanten Unsinn, also traf ich einfach das Lesezeichen 'kürzen mit bit.ly', um es sauberer zu machen. Danke für die Aktualisierung. –
Ein anderer Vorteil der Verwendung von createObject()
ist, dass Sie die init()
Methode, z.
<cfset myObject = createObject("com.path.MyObject").init() />
Und wenn Ihr init()
kehrt this
Sie weiter und Kette der Methode gehen können, wenn Sie das Objekt nicht wieder verwenden müssen:
<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />
Es ist erwähnenswert, dass 9 in CF können Sie Verwenden Sie die neue Syntax (ähem) new
, um Objekte zu erstellen. Zum Beispiel das gleiche Objekt wie oben zu schaffen und nennen es init()
kann ich schreiben:
<cfset myObject = new com.path.MyObject() />
Es ist ordentlich und Ich mag die Möglichkeit, dies zu tun. Mit solchen Features bewegt sich CF meiner Meinung nach in die richtige Richtung.
-1 für "aber ein Pro ist es Sie können die Methoden innerhalb eines CFC dynamisch durchlaufen. In createobject können Sie nicht." für (var k in o) { \t if (isCustomFunction (o [k])) { \t \t o [k] (argument = was auch immer); \t} } Dies funktioniert wörtlich in Railo. Für Adobe CF 7-9 müssen Sie Folgendes tun: var k = ''; für (k in o) { \t var m = o [k]; \t if (isCustomFunction (m)) { \t \t m (argumentCollection = was auch immer); \t} } –