Transfert d'une variable par référence dans une extension PHP
-
21-08-2019 - |
Question
J'écris une extension PHP qui prend une référence à une valeur et le modifie. Exemple PHP:
$someVal = "input value";
TestPassRef($someVal);
// value now changed
Quelle est la bonne approche?
La solution
Modifier 2011-09-13 :
La bonne façon de le faire est d'utiliser la famille de macros ZEND_BEGIN_ARG_INFO()
- voir Extension et intégration chapitre PHP 6 (Sara Golemon, Bibliothèque de développeur) .
Cette fonction d'exemple prend un argument de chaîne par valeur (en raison de l'appel ZEND_ARG_PASS_INFO(0)
) et tous les autres après par référence (en raison du deuxième argument de ZEND_BEGIN_ARG_INFO
étant 1).
const int pass_rest_by_reference = 1;
const int pass_arg_by_reference = 0;
ZEND_BEGIN_ARG_INFO(AllButFirstArgByReference, pass_rest_by_reference)
ZEND_ARG_PASS_INFO(pass_arg_by_reference)
ZEND_END_ARG_INFO()
zend_function_entry my_functions[] = {
PHP_FE(TestPassRef, AllButFirstArgByReference)
};
PHP_FUNCTION(TestPassRef)
{
char *someString = NULL;
int lengthString = 0;
zval *pZVal = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &someString, &lengthString, &pZVal) == FAILURE)
{
return;
}
convert_to_null(pZVal); // Destroys the value that was passed in
ZVAL_STRING(pZVal, "some string that will replace the input", 1);
}
Avant d'ajouter le convert_to_null
il fuite de mémoire à chaque appel (je l'ai pas si cela est nécessaire après l'ajout d'appels ZENG_ARG_INFO()
).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow