Paso de una variable por referencia a una extensión de PHP
-
21-08-2019 - |
Pregunta
Estoy escribiendo una extensión de PHP que tiene una referencia a un valor y lo altera. Ejemplo PHP:
$someVal = "input value";
TestPassRef($someVal);
// value now changed
¿Qué es el enfoque correcto?
Solución
Editar 2011-09-13 :
La forma correcta de hacerlo es utilizar la ZEND_BEGIN_ARG_INFO()
familia de macros - ver Incorporación de PHP capítulo 6 (Sara Golemon, Biblioteca del desarrollador) .
Esta función ejemplo toma un argumento cadena por valor (debido a la llamada ZEND_ARG_PASS_INFO(0)
) y todos los otros después de que por referencia (debido al segundo argumento de ZEND_BEGIN_ARG_INFO
ser 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);
}
Antes de añadir la memoria convert_to_null
que se filtrara en cada llamada (no si esto es necesario después de la adición de llamadas ZENG_ARG_INFO()
tengo).
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow