ColdFusion: obtenir le type de variable
La balise ColdFusion <cfdump />
me donne beaucoup moins d'informations que la fonction PHP var_dump()
.
Existe-t-il une autre possibilité dans CF de savoir de quel type (entier, chaîne, etc.) ma variable est?
2 réponses
CFML est typé dynamiquement, de sorte que les types peuvent changer selon les besoins.
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 si quelque chose est un type spécifique, autant que si peut être automatiquement converti en un type spécifique-pour cette raison, il y a des fonctions, y compris isSimpleValue, isnumérique, isDate , et divers autres .
Donc si appeler isNumeric(string)
renvoie true, alors vous savez que vous pouvez utiliser cette variable à des fins mathématiques.
Pour la plupart, c'est tout ce que le développeur CF moyen 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 directement les types, vous devez savoir Qu'Adobe ColdFusion fait des choses amusantes avec les types-faire <cfset number = 123 />
entraîne une chaîne pas un type numérique.
En effet, la plupart des valeurs simples dans ACF sont créées en tant que chaînes (puis automatiquement converties en type approprié si nécessaire).
En même temps, Toutes les valeurs simples ne sont pas stockées sous forme de chaînes - si vous faites <cfset number = 1 + 1 />
, vous obtenez un nombre à 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 ceci:
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 longue est que si CF devait montrer le type lorsque vous avez jeté, la moitié du temps, il dirait "chaîne" et ne sera pas nécessairement très utile.
Solution de contournement
Si vous avez besoin de connaître les types [potential], vous devez créer votre propre balise/fonction de vidage qui utilise les fonctions de vérification de conversion décrites ci-dessus pour déterminer ce que vous regardez et afficher les informations pertinentes.
Railo et Types
Comme mentionné dans le commentaire De Busch, Railo (une alternative CFML engine) affiche les types lorsque vous videz, et il affiche les types corrects.
C'est parce que Railo ne convertit pas (presque) tout en une chaîne - il commence par le type pertinent, et convertit si nécessaire.
Pour montrer cela, vous pouvez exécuter l'extrait de code ci-dessus, voici les résultats de L'exécution sur 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 type simple d'un mot, vous pouvez probablement obtenir une valeur sensible avec ceci:
ListLast(type,'.').replaceAll('Impl$','')
(Il N'y a pas de Java->CFML spécifique fonction de conversion - vous pouvez voir comment l'étiquetage de type est fait pour cfdump en en regardant le code source pertinent .)
Les Variables dans CF sont sans type. Il appartient aux meilleures pratiques des développeurs de les utiliser correctement, mais CF traite les variables de la même manière, qu'il s'agisse d'entiers ou de chaînes.
Pour les structures ou les tableaux ou les composants / fonctions, plus de détails sont disponibles via CFDUMP.