Services webmasters
Partenaires
Jeux concours gratuits
 
Accéder aux arguments
<<<
Traiter les arguments passés par référence Assurer les autres paramètres contre l'écriture
>>>

8.9 Gestion des arguments
8 Développer PHP 4.0
 Manuel PHP

Déterminer le nombre d'arguments
Lire les arguments
Ancienen méthode de lecture des arguments (obsolète)
Traitement des nombres d'arguments variables et des paramètres optionnels
Accéder aux arguments
->Traiter les arguments passés par référence
Assurer les autres paramètres contre l'écriture

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. .

<< Traiter les arguments passés par référence >>
Accéder aux arguments Gestion des arguments Assurer les autres paramètres contre l'écriture
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -