family cold cfm coldfusion variables scope

coldfusion - family - cfm cold fusion



En ColdFusion, las variables se resuelven en qué orden? (2)

Tengo poca impresión sobre el orden de resolución de las variables, pero no puedo encontrarlo en la Guía de referencia de CFML o ColdFusion. ¿Alguien puede ayudar?


Es una buena práctica generalmente aceptada que siempre abarque sus variables por dos razones principales:

  • Rendimiento - CF no necesita encontrar la variable buscando a través de los ámbitos a su vez
  • Exactitud: si dos variables tienen el mismo nombre en diferentes ámbitos, es posible que no obtenga la que estaba esperando

Dicho esto, aquí está el orden en el que se buscan los ámbitos de las variables:

  1. Función local (palabra clave VAR)
  2. Hilo local (CFTHREAD)
  3. Resultados de consulta
  4. Función ARGUMENTOS
  5. VARIABLES locales
  6. Variables CGI
  7. Variables de archivo
  8. Parámetros de URL
  9. Campos FORM
  10. Valores de COOKIE
  11. Variables CLIENT

EDITAR: También es significativo observar qué ámbitos no se buscan: SESIÓN, SERVIDOR, APLICACIÓN


Orden de alcance

El orden de alcance canónico para ColdFusion 9 es:

  1. Local (solo dentro de CFC y UDF)
  2. Argumentos (solo dentro de los CFC y UDF)
  3. Rosca local (solo dentro de los hilos)
  4. Consulta (solo dentro de un bucle de consulta)
  5. Subproceso (solo dentro de subprocesos y plantillas que invocan subprocesos)
  6. Variables
  7. CGI
  8. Cffile
  9. URL
  10. Formar
  11. Galleta
  12. Cliente

Puede ver la documentación de Adobe al respecto en Desarrollar aplicaciones de ColdFusion 9 .

Sin embargo, algunos ámbitos solo están disponibles en determinados contextos, por lo que el orden en que se buscan los ámbitos es diferente, según el contexto del código.

Dentro de CFML (sin hilos)

  1. Variables
  2. CGI
  3. Cffile
  4. URL
  5. Formar
  6. Galleta
  7. Cliente

Dentro de un CFC (sin hilos)

  1. Local
  2. Argumentos
  3. Consulta (solo dentro de un bucle de consulta)
  4. Variables
  5. CGI
  6. Cffile
  7. URL
  8. Formar
  9. Galleta
  10. Cliente

Mejores prácticas

Como señala Al Everett en su respuesta, se considera la mejor práctica tener siempre las variables de alcance. El alcance explícito produce un código menos ambiguo y suele ser más rápido. Cada vez que no delimita una variable, corre el riesgo de obtener una variable de un ámbito que no tenía la intención de.

Cuando la variable a la que está accediendo está en el primer ámbito en el orden de búsqueda, en realidad es un poco más rápido dejar la variable sin ámbito. Esto se debe a que cada punto en un nombre de variable incurre en un pequeño costo ya que ColdFusion lo resuelve. Por ejemplo, en un método CFC es un poco más rápido acceder a myVar que a local.myVar . Esto solo se aplica a:

  • variables de ámbito local dentro de un CFC o UDF
  • Enhebrar variables de ámbito local dentro de un hilo
  • variables ámbito de variables dentro de CFML

En todas las demás circunstancias, es más rápido (y más claro) declarar explícitamente el alcance.

El uso de esta técnica debe considerarse una mala práctica. Solo debe utilizar esta técnica en el código de rendimiento crítico, donde puede garantizar que la variable siempre exista en el ámbito previsto. Tenga en cuenta que tiene el costo de una mayor ambigüedad.