web-dev-qa-db-fra.com

Coldfusion: obtenir un type de variable

La balise Coldfusion <cfdump /> Me donne beaucoup moins d'informations que le PHP var_dump().

Y a-t-il une autre possibilité dans les FC de savoir quel type (entier, chaîne, etc.) ma variable est?

25
Toby

La CFML est dactylographiée dynamiquement. Les types peuvent donc changer si nécessaire.

Vous pouvez voir le type actuel (JVM) d'une variable en faisant <cfdump var=#getMetadata(var)# /> ou simplement en accédant à getMetadata(var).getName().

Généralement, vous ne vous souciez pas de savoir si quelque chose est un type spécifique, alors que ce soit peut être de lancer automatiquement à un type spécifique - pour cette raison là-bas sont des fonctions, y compris issimplevalue , isnumeric , isdate , et divers autres .

Donc, si appeler isNumeric(string) retourne true, vous savez que vous pouvez utiliser cette variable à des fins mathématiques.

Pour la plupart, c'est que tout le développeur moyen des FC se soucie et le reste de cette réponse n'est probablement pas important (mais bien sûr, pourrait toujours être intéressant).

Coldfusion et types

Si vous avez des raisons de traiter des types directement, vous devez savoir que Adobe Coldfusion fait des choses drôles avec des types - faire <cfset number = 123 /> Résultats dans une chaîne n'est pas un type numérique.

En effet, la plupart des valeurs simples dans ACF sont créées comme chaînes (puis automatiquement au type correspondant en cas de besoin).

Dans le même temps, toutes les valeurs simples ne sont pas stockées comme des chaînes - si vous le faites <cfset number = 1 + 1 /> Ensuite, vous obtenez un numéro à la place.

Vous pouvez voir les types utilisés avec ce code:

<cfset TypeTest =
    { array   = []
    , struct  = {}
    , string  = "123"
    , number  = 123
    , boolean = true
    , date    = Now()
    , number2 = 1+1
    }/>

<cfloop item="key" collection=#TypeTest# >
    <cfoutput><br/> #key# = #getMetadata(typetest[key]).getName()#</cfoutput>
</cfloop>


[.____] Les résultats de ce code dans CF10 sont comme:

ARRAY = coldfusion.runtime.Array
STRUCT = coldfusion.runtime.Struct
STRING = Java.lang.String
NUMBER = Java.lang.String
BOOLEAN = Java.lang.String
DATE = coldfusion.runtime.OleDateTime
NUMBER2 = Java.lang.Double

La raison de cette explication à long terme est que si cf était de montrer le type lorsque vous avez largué, la moitié du temps qu'il dirait "chaîne" et non nécessairement très utile.

Workaround

Si vous devez connaître des types [potentiels], vous devez créer votre propre étiquette/fonction de vidage qui utilise des fonctions de contrôle de conversion décrites ci-dessus pour déterminer ce que vous regardez et émettez les informations pertinentes.

Railo et types

Comme mentionné dans le Commentaire de Busches , Railo (un autre moteur CFML) affiche des types lorsque vous déchargez et indique les types corrects.

C'est parce que Railo ne convertit pas uniquement (presque) tout sur une chaîne - il commence par le type correspondant et convertit si nécessaire.

Pour montrer cela, vous pouvez exécuter l'extrait de code ci-dessus, voici les résultats de courir contre Railo 3.3:

ARRAY = railo.runtime.type.ArrayImpl
STRUCT = railo.runtime.type.StructImpl
STRING = Java.lang.String
NUMBER = Java.lang.Double
BOOLEAN = Java.lang.Boolean
DATE = railo.runtime.type.dt.DateTimeImpl
NUMBER2 = Java.lang.Double

Si vous vouliez un simple type d'un mot, vous pouvez probablement obtenir une valeur sensible avec ceci:

ListLast(type,'.').replaceAll('Impl$','')

(Il n'y a pas de fonction de conversion Java-> CFML spécifique - Vous pouvez voir comment l'étiquetage de type est effectué pour CFDump par en regardant le code source correspondant .)

56
Peter Boughton

Les variables en CF sont moins de type. Il appartient aux meilleures pratiques des développeurs pour les utiliser correctement mais CF traite les variables identiques, qu'il s'agisse d'entiers ou de cordes.

Pour les structures ou les tableaux ou composants/fonctions Plus de détails sont disponibles via CFDUMP.

4
Rob Barthle