8
votes

Comment puis-je appeler un nom de variable dans le cadre d'un nom de fonction à ColdFusion?

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')#');


0 commentaires

4 Réponses :


12
votes

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>


3 commentaires

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 () et ["bob '] () - 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!



1
votes

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 prend une chaîne comme valeur d'attribut de méthode, ce qui peut - évidemment - prêter une valeur dynamique que vous aimez.

Ce n'est pas si uch aide pour votre situation spécifique, mais il est pratique de garder à l'esprit.

Je n'utiliserais pas l'approche d'évaluation ().


0 commentaires

0
votes

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> xxx pré>

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) />


1 commentaires

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é.



0
votes

Une autre approche de cette question consiste à utiliser un UDF tel que le suivant: xxx pré>

Si vous avez besoin de vous pouvez cela: P>

<cfset retval = createObject("methodinvoker").callMethod(methodName,methodArgs) />


0 commentaires