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?

Était-ce utile?

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
scroll top