La définition n'est pas facile à saisir, mais elle me semble exacte.Wikipedia a écrit :En programmation informatique, la réflexion est la capacité d'un programme à examiner, et éventuellement à modifier, ses structures internes de haut niveau (par exemple ses objets) lors de son exécution.
Pour faire plus simple, la réflexion, c'est la capacité a un programme de pouvoir, par exemple, lire le contenu d'une variable grace a son nom, mais aussi de pouvoir modifier son contenu de la même manière.
Le fait de lire du contenu par réflexion s'appelle l'introspection.
Le fait d'écrire du contenu par réflexion s'appelle l'intercession.
Les fonctions liées à la réflexion mises a notre disposition sont :
-Eval()
-IsDeclared()
-Assign()
-Call()
-Execute()
Eval() et IsDeclared() font de l'introspection, Assign() et Call() de l'intercession et Execute() est un peu mixte.
La fonction Eval() :
Cette fonction retourne la valeur de la variable dont le nom est passé en paramètre :
Code : Tout sélectionner
$maVariable = 5
Eval("maVariable")
La fonction IsDeclared() :
Pour utiliser Eval(), il est bon de savoir si la variable existe avant. IsDeclared() permet de savoir par un nom de variable si elle existe, et si elle est local ou non (voir les Scope)
Code : Tout sélectionner
$maVariable = 5
If IsDeclared("maVariable") Then
Eval("maVariable")
EndIf
La fonction Assign() :
Cette fonction permet d'assigner une valeur a une variable, et de la créer si elle n'existe pas.
Code : Tout sélectionner
Assign("variable", "Hello", 2)
MsgBox(0,"test",$variable)
Scite va lancer un message d'erreur a la compilation, car pour lui $variable n'existe pas. Mais si l'on compile quand même, tout fonction car le 3em paramètre passé a Assign() demande la création de la variable.
La fonction Call() :
Call() permet d'appeler une fonction et de lui passer des paramètres. Call() retourne la valeur de retour de la fonction appelée.
Code : Tout sélectionner
$maVariable = 0
Call("set",10)
MsgBox(0,"test",$maVariable)
Func set($param)
$maVariable = 5 + $param
EndFunc
La fonction Execute() :
La fonction Execute() est bien plus puissante que les autres. Elle permet d'exécuter un bout de code et renvoie ce que le code retourne. Ce code est envoyé sous forme de chaine de caractères une fois de plus.
Code : Tout sélectionner
$maVariable = 4
$autre = Execute("$maVariable + 5")
Mais l'ont peut aussi faire des choses bien plus intéressantes en demandant a Execute() d'évaluer une fonction
Code : Tout sélectionner
$maVariable = 4
$autre = Execute("Assign('maVariable',5)")
MsgBox(0,'test',$maVariable)
Attention !
Code : Tout sélectionner
[code]$maVariable = 0
Execute("$maVariable = 5")
On peut utiliser Execute() à la manière d'Eval()
Code : Tout sélectionner
$maVariable = 4
$autre = Execute("$maVariable")
MsgBox(0,'test',$autre)
Code : Tout sélectionner
$maVariable = 0
Execute("set(10)")
MsgBox(0,"test",$maVariable)
Func set($param)
$maVariable = 5 + $param
EndFunc
Voici des exemple de cas ou ces fonctions peuvent être utile. Je précise bien "utile" car l'on peut en coller un peu partout dans un script sans que leur appel soit pertinent !
Eval() :
Eval() fonctionne de paire avec Assign(). Dans le cadre ou l'on doit créer des variables dynamiquement, c'est la solution pour récupérer leur valeur.
Ex : J'ai un fichier text contenant des paires clef/valeur, je peux créer des variables au nom de la clef contenant la valeur. Plus loin dans le script, ou même de manière externe grace à Execute(), je n'aurai qu'a préciser le nom de la clef pour en obtenir la valeur. Je peux donc avoir un autre fichier texte contenant que des clef, et par magie, demander à Autoit d'additionner leur valeur contenue dans l'autre fichier texte !
IsDeclared() :
Il s'agit la surtout d'une sécurité pour les Eval(), mais l'ont peut trouver d'autre utilités.
Dans notre exemple, ci dessus, apres lecture du 1er fichier texte, IsDeclared($name) permet de savoir si une clef est présente.
Assign() :
Restons toujours dans le même exemple.
Âpres avoir récupéré toute les clef/valeurs, je souhaite leur appliquer une transformation, Assign() me permet donc d'après le nom de la clef de modifier la variable.
Call() :
Imaginons un logiciel de configuration possédant plusieurs fonctions qui doivent être appelée ou non. l'on peut passer la liste des fonctions à appeler en paramètre, une boucle For et Call() se chargeront du reste !
Execute() :
Les cas d'utilisations de cette fonctions sont trop vaste pour essayer de les résumer rapidement. Pensez juste cela :
Vous pouvez demander à votre programme de faire quelque chose non présent dans le code, après la compilation.
Juste cette phrase permet d'imaginer la puissance de cette fonction !
La réflexion est une chose extrêmement puissante qui peut rendre les programme beaucoup plus propre et puissant, a condition d'être bien utilisé !!
Réfléchissez donc à la pertinence de leur utilisation avant de les taper, car elles peuvent aussi rendre votre code très lourd et très crade !
Un petit exemple pour montrer la puissance d'Eval, Assign, IsDeclared, mais aussi les risques !
liste.txt contient une liste de personnes et leur salaire.
aug.txt est une liste de personne a augmenter (marquez "aug.txt" dans l'inputbox)
Pour faire planter le truc, essayez d'augmenter une variable du script
