2016-09-16 4 views
1

schrieb ich eine Funktion:Funktion und gespeicherte Prozedur können nicht denselben Namen haben?

function getArtists(where='', artistactive = true){ 
    //yadayada 
    return artists; 
} 

und enthalten es, in einer Vorlage, nach folgenden

<cfstoredproc datasource="#request.dsn#" procedure="GetArtists"> 
    <cfprocresult name="GetArtists"> 
</cfstoredproc> 

Dies erzeugt einen Fehler:

Routines cannot be declared more than once. The routine getArtists has been declared twice in different templates

Ok, so Frage 1: ColdFusion denkt, dass eine Funktion und eine gespeicherte Prozedur beide "Routinen" sind und nicht zweimal deklariert werden können?

Also, das nächste, was ich tat, war, meine Funktionen Vorlage vor die gespeicherte Prozedur zu integrieren ... und es scheint in Ordnung zu sein, mit dem.

Frage 2: Was gibt?

Antwort

5

Sie sollten den Fehler glauben. Beim Testen Ihres Codes erhalte ich keinen Fehler, wenn ich die Funktion deklariere und dann einen gespeicherten Proc mit demselben Namen aufruft. Wenn ich den Variablenbereich unter Verwendung von <cfdump var="#variables#"> I nur ausgeben lasse, sehe ich die Ergebnismenge (nicht die Funktion), da die Funktion von der Ergebnismenge überschrieben wurde. Wenn ich versuche, die Funktion nach dem Erklären der Funktion aufzurufen und sie dann zu überschreiben, erhalte ich den Fehler "Incorrect entity type for being a function".

Denken Sie daran, dass der CF-Compiler Ihren Code durchläuft und zuerst UDFs und Komponenten kompiliert. Sie werden zur Laufzeit nicht kompiliert. Der Fehler, auf den Sie verweisen, tritt während der Kompilierung auf, nicht während der Laufzeit. Aus diesem Grund denke ich, dass es wahrscheinlicher ist, dass Ihre UDF-Routine tatsächlich mehr als einmal enthalten ist. Sehen Sie sich die Debug-Informationen unten an und suchen Sie nach dieser Datei, um zu sehen, ob dies der Fall ist - oder untersuchen Sie benutzerdefinierte Tag-Aufrufe und andere Möglichkeiten, bei denen Dateien verdoppelt werden.

Hinweis: UDF sollte in der Regel in einem eigenen Space deklariert werden (onRequest() ist ein guter Platz dafür) und sollte vor solchen Dingen geschützt werden. Ich verwende eine Variable wie "lib" und speichere meine Funktionen (die wie Java Objekte von Objekten sind) als lib.function1(), lib.function2(). Die Art, wie Sie es tun, führt zu Unvorhersehbarkeit. Das letzte ist nur meine Meinung - versuchen zu helfen. :)

+1

* tritt während der Kompilierung * Ja, und das im Zusammenhang mit warum der Fehler nur auftritt, wenn das Include * nach * cfstoredproc aufgerufen wird. Wie Sie bereits sagten, werden Funktionen auch im 'variables'-Bereich gespeichert. Daher rate ich, dass CF zuerst diesen Gültigkeitsbereich überprüft - eine Variable mit demselben Namen bereits existiert - und einen Fehler (wenn auch nicht vollständig) auslöst. – Leigh

+0

php guy, nicht daran gewöhnt, dass Funktionen in Variablen gespeichert sind ... gibt es etwas zu deklarieren, wenn lib.function ausgeführt wird? oder nennst du einfach deine Funktionen wie lib.function und nennst sie als solche? result = lib.function (irgendeinvar); –

+0

@DougCassidy Variablen, die Funktionszeiger enthalten, sind sehr praktisch, um ein kleines bisschen funktionaler Programmierung in CFML zu erhalten. Genau wie bei JavaScript müssen Sie darauf achten, den globalen Geltungsbereich, der Variablen für ColdFusion-CFCs und CFMs ist, nicht zu "verschmutzen". –

Verwandte Themen