8.9.6 Traiter les arguments passés par référence
Si votre fonction accepte des arguments passés par référence, et que vous
souhaitez les modifier, vous devez prendre quelques précautions.
Ce que nous n'avons pas encore dit, c'est que dans les circonstances
qui vous ont été présentées, vous n'avez aucun droit d'écriture
dans les enveloppes
zval
qui vous ont été passé.
Bien entendu, vous pouvez modifier toutes ces enveloppes, mais
voues ne devez changer aucun
zval
qui fasse
référence aux données interne de Zend.
Nous avons uniquement présenté les fonctions
*_ex
de l'API. Vous pouvez avoir remaqué que cette API s'appelle
zend_get_parameters_ex
au lieu de
zend_get_parameters
,
convert_to_long_ex
au lieu de
convert_to_long
, etc... Les fonctions
*_ex
représentent la nouvelle API Zend
étendue. Elles apporte une petite amélioration en terme de
vitesse d'exécution, mais en échange, elles ne fournissent
qu'un accès en lecture aux arguments.
Comment Zend travaille en interne avec des références, ces
différentes variables pourrait faire référence à la même valeur.
L'accès en écriture aux variables
zval
requiert
cette enveloppe pour contenir une valeur isolée, ce qui signifie
que la valeur n'est pas référencée par une autre enveloppe. Si une
enveloppe
zval
étaait référencée et que vous
modifiez la valeur
zval
, vous changeriez automatiquement
le contenu de toutes les enveloppes qui y font référence (car
elles ne font que pointer sur une valeur que vous modifiez, et qui
donc, modifie leur valeur en même temps).
zend_get_parameters_ex
ne se préoccupe pas
de la situation, mais retourne simplemetn un pointeur sur l'enveloppe
zval
, que cette dernière soit une référence ou pas.
La fonction correspondante de l'API traditionnelle
zend_get_parameters
, vérifie immédiatement
les valeurs référencées. Si elle trouve une référence, elle
crée une nouvelle enveloppe
zval
isolée, copie
les données référencées dans le nouvel espace allouée et retourne
un pointeur sur la nouvelle valeur créée.
Cette action est appelée
séparation zval
(ou séparation pval). Mais comme l'API
*_ex
ne fait pas cette séparation, elle est considérablement plus rapide,
mais au prix de l'accès en écriture.
Pour modifier les paramèters, il vous faut cependant un accès en écriture.
Zend gère cette situation d'un manière spéciale : lorsqu'un paramètre
est passé à une fonction par référence, il pratique une séparation
zval automatique. Cela signifie qu'à chaque fois que vous appelez une
fonction PHP avec un argument passé par référence, Zend va automatiquement
s'assurer que
$parameter
est bien passé comme une valeur
isolée, pour le rendre accessible en écriture.
ma_function(&$parameter);
Mais ce
n'est pas le cas
avec les paramètres réguliers.
Tous les autres paramètres qui ne sont pas passés par référence sont dans un
état de lecture seule.
Cela vous impose de vous assurer que vous voulez vraiment travailler
avec une référence : sinon, vous risquez de générer des effets
secondaires nuisibles. Pour vérifier qu'un paramètre
est passé par référence, vous pouvez utiliser la macro
PZVAL_IS_REF
. Cette macro accepte un
zval*
pour vérifier si c'est une référence
ou pas. Des exemples sont fournis dans Test des paramètres passés par référence. .
|