8.9.5 Accéder aux arguments
Pour accéder aux arguments, il est nécessaire que le type de chaque
argument soit clairement défini. Encore une fois, la nature
extrêmement dynamique de PHP introduit des couaks. Comme PHP
ne fait aucune validation de type, il est possible que le
script appelant passe n'importe quel type de données à
vos fonctions. Si vous attendez un entier, rien n'empêche
le programmeur de vous passer un tableau, et vice-versa.
PHP ne s'en préoccupe pas.
Pour résoudre de problème, vous devez utiliser un jeu d'API
pour forcer la conversion de type de chaque argument qui est
passé (voyez Fonction de conversion ).
Note:
Toutes les fonctions de conversion
attendent une enveloppe
**zval
comme paramètre.
Note |
Vous pouvez trouver une démonstration de ces conversions dans le fichier
cross_conversion.php
sur le CD ROM d'accompagnement.
Conversions en PHP. illustre l'affichage.
|
En utilisant ces fonctions sur vos arguments, vous vous assurerez
du type des données qui vous sont passées. Si le type de la valeur fournie
ne correspond pas à celui que vous souhaitez, PHP force la valeur à
une valeur de remplacement classique (chaînes vides, tableaux ou objets
vides,
0
pour les nombres,
FALSE
pour les booléens), afin d'avoir toujours un état défini.
Voici un extrait du module présenté ci-dessus, qui effectue une conversion :
zval **parameter;
if((ZEND_NUM_ARGS() != 1) || (zend_get_parameters_ex(1, ¶meter) != SUCCESS)) { WRONG_PARAM_COUNT; }
convert_to_long_ex(parameter);
RETURN_LONG(Z_LVAL_P(parameter));
Après avoir lu le pointeur du paramètre, la valeur est convertie en long
(un entier) qui sera aussi la valeur retournée par la focntion. Comprendre
l'accès aux valeurs nécessite une présentation du type
zval
,
dont les définitions sont présentés Définition du type zval . .
En fait,
pval
(défini dans
php.h
) est
simplement un alias de
zval
(défini dans
zend.h
),
qui lui-même fait référence à
_zval_struct
. C'est une structure
très interessante.
_zval_struct
est la structure "principale" qui
contient la valeur, son type et des informations de référence. La sous-structure
zvalue_value
est une union qui contient la valeur de la variable.
Suivant le type de la variable, vous pouvez accéder à différents membres
de l'union. Pour une description complète des deux structutres, voyez
Structure Zend zval ,
Structure Zend zvalue_value et
Constantes de type Zend Variable .
Pour accéder à la valeur d'un long, vous pouvez y accéder avec
zval.value.lval
, pour un double, vous pouvez y
accéder avec
zval.value.dval
, et ainsi de suite...
Comme toutes les valeurs sont stockées dans une union,
accéder à un membre qui ne coresspond pas au type en cours
retourne des valeurs sans aucun sens.
Accéder aux tableaux et objets est un peu plus compliqué,
et sera discuté plus tard.
|