2016-03-04 2 views
2

Que faut-il, pour tirer profit du gain de performance de ColdFusion 2016's new setting searchImplicitScopes="false":Les variables sont-elles considérées comme des étendues implicites à l'intérieur d'un CFC dans CF2016?

... bypasses searching for a variable in the implicit scopes thus finding the variables defined in the application faster.

Doit-on commencer à la portée Variables & This portées à l'intérieur d'un CFC avec searchImplicitScopes="false" dans ColdFusion 2016?

Je ne trouve aucune documentation sur ce que l'on considère comme des portées implicites dans CF2016. Je suis assez sûr local et arguments étendues sont bien à l'intérieur d'une fonction, mais qu'en est-il des étendues fréquemment utilisés comme variables et this dans un CFC?

+0

Désolé - Je n'ai pas vu votre réponse était spécifique à la version. –

Répondre

3

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>

  1. foo est dans le champ variables, vous obtiendrez une erreur: Element FOO is undefined in TEST.
  2. bar est dans le périmètre this, de sorte que vous obtenez la sortie pour test.bar.
  3. narf est dans le périmètre variables, vous obtiendrez une erreur: Element NARF is undefined in TEST.
  4. 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:

  1. développeurs ne sont pas utilisés pour var fonction de cadrage variables locales
  2. développeurs qui étaient, avaient tendance à faire var local = structNew(), de sorte qu'ils ne devaient var la portée d'une variable .
  3. 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.

+0

portée toutes les choses? même 'local' et' arguments'? Désolé, je viens de reformuler ma question pour préciser que je demande ce qu'il faut pour profiter du gain de performance dans 'searchImplicitScopes = false' de CF2016. – Henry

+1

Portée chaque chose. même «local» et «arguments» –

+0

@AdrianJMoreno «Je dirais, oui» seriez-vous en mesure de confirmer cela? Je n'ai pas encore installé CF2016. Je peux poster ma réponse demain quand je le découvrirai. – Henry

0

Je viens d'installer CF 2016 Express et je peux conclure qu'avec searchImplicitScopes="false", la portée Variables est toujours recherchée lorsqu'une variable n'est pas étendue, mais pas la portée This.