Portée toutes les choses !!!
La portée variables
dans un CFC est globale pour toutes les fonctions à l'intérieur du CFC. L'étendue this
à l'intérieur d'un CFC est globale à toutes les fonctions à l'intérieur du CFC et peut également être référencée par l'appelant du CFC.
Si vous ne définissez pas une variable dans un CFC, la valeur par défaut est variables
.
<--- this_test.cfc --->
<cfcomponent>
<cfset variables.foo = "This is my CFC global variable." />
<cfset this.bar = "This variable is global to my CFC and can be referenced externally." />
<cfset narf = "Global variable! Point!" />
<cffunction name="getNarf" access="public">
<cfreturn narf />
</cffunction>
</cfcomponent>
Appel d'essai:
<cfset test = new this_test() />
<cfoutput> <li>#test.foo#</li> <li>#test.bar#</li> <li>#test.narf#</li> <li>#test.getNarf()#</li> </cfoutput>
foo
est dans le champ variables
, vous obtiendrez une erreur: Element FOO is undefined in TEST.
bar
est dans le périmètre this
, de sorte que vous obtenez la sortie pour test.bar
.
narf
est dans le périmètre variables
, vous obtiendrez une erreur: Element NARF is undefined in TEST.
- La seule façon d'obtenir la valeur de
narf
est d'avoir une fonction retourner.
Mise à jour
Ce searchImplicitScopes
peut désactiver la fonction de recherche de portée des FC. Donc, si vous ne portez pas sur quelque chose, il ne recherchera pas la hiérarchie des étendues. La question est, est-ce qu'une variable non-étendue finit dans la portée variables
par défaut? Je dirais, oui, car c'est le défaut depuis que les CFC ont fait leurs débuts. Indépendamment de l'utilisation de ce paramètre, je dis toujours tout ce qui concerne l'étendue. La seule raison pour laquelle ils ont créé le champ local
implicite est que:
- développeurs ne sont pas utilisés pour
var
fonction de cadrage variables locales
- développeurs qui étaient, avaient tendance à faire
var local = structNew()
, de sorte qu'ils ne devaient var
la portée d'une variable .
- 2 leur a également donné la possibilité de retourner la collection de variables locales de fonction.À partir de CF 9, lorsque
var a = 0
est devenu le même que local.a = 0
, vous pouvez supprimer toutes les instances de var local = structNew()
, à condition que vous ayez également "défini" et référencé ces variables privées comme local.a
.
La ligne de fond
est qu'il ya certains frais généraux de performance si CF doit rechercher des champs variables à chaque demande. Si vous avez désactivé cette recherche en utilisant searchImplicitScopes=false
, vous devriez obtenir une amélioration des performances. Mais alors, cela devrait vraiment dépendre de votre application et de la charge moyenne des requêtes.
Désolé - Je n'ai pas vu votre réponse était spécifique à la version. –