J'écris une fonction qui bouclait certaines informations sur une page d'enregistrement. Dans la boucle, j'essaie d'appeler des fonctions basées sur un tableau. Ce que j'ai des problèmes avec qui appelle correctement les fonctions correctement, car j'essaie d'intégrer une variable dans le nom du nom de la fonction.
Voici mon code: P>
writeoutput('#validate_email('email@site.com')#');
4 Réponses :
Les fonctions
sont également variables, de la même manière que vous pouvez utiliser la notation de support pour les tableaux, les structures et les étanches, vous pouvez l'utiliser pour accéder aux noms de variable dynamiques (et donc les noms de fonction dynamiques)
Par exemple: P>
<cfloop index="Field" list="email,uname,pass"> <cfset TmpFunc = Variables['validate_'&Field] /> <cfset Result = TmpFunc( Variables['r_'&Field] ) /> ... </cfloop>
Ce n'est pas un bogue dans cf, Peter: il n'est tout simplement jamais été imnplété. Vous voudrez peut-être réviser votre commentaire à cet effet. Sinon, une réponse sur place.
Il ne devrait y avoir aucune différence entre variables.bob () code> et
["bob '] () code> - cependant, le second jette une erreur. J'appelle qu'un bogue dans la notation de support, pas une fonctionnalité non immentée.
Merci pour cela. Les deux suggestions que j'ai reçues du travail génial. Je suis nouveau à cf, alors je vais avec la foule et j'utilise cela plutôt que l'autre. L'autre est un peu plus facile, mais s'il y a un problème avec cela, je ne veux pas entrer dans cela! Merci encore!
La réponse de Peter est sur place (à l'exception de la référence "Bug" que j'ai commentée). Une autre option si on n'est pas au milieu d'un bloc CFScript est que Ce n'est pas si uch aide pour votre situation spécifique, mais il est pratique de garder à l'esprit. P>
Je n'utiliserais pas l'approche d'évaluation (). p>
J'ajouterai qu'avant Coldfusion 6.1 et le passage à Java, évaluez () a toujours été considéré comme anathema à la performance, mais comme 6.1, tout cela est évalué, puis crée un pagecontext intégré avec la chaîne incluse comme code.
très slick, très performant. p>
Donc, la manière la plus simple et la plus simple d'atteindre vos objectifs est la suivante: p> si supposant que vous avez un Field nommé "Nom d'utilisateur", ce sera l'équivalent de la méthode suivante Call: P> <cfset result = validate_username(variables.r_username) />
En ce qui concerne l'avertissement d'Adam contre Evaluate (), autre que d'être stupide et l'utiliser pour évaluer les valeurs fournies par l'utilisateur (comme permettant aux utilisateurs de taper essentiellement le code dans - oui, cela a été fait) Il n'y a aucune raison d'éviter d'utiliser cette méthode. Il n'y a pas de performance persistante ni de problèmes de sécurité.
Une autre approche de cette question consiste à utiliser un UDF tel que le suivant: Si vous avez besoin de vous pouvez cela: P> <cfset retval = createObject("methodinvoker").callMethod(methodName,methodArgs) />