Llamando a Funciones del Usuario

Para llamar a funciones del usuario desde una función interna , deberá usar la función call_user_function( ) .

call_user_function( ) devuelve SUCCESS si tiene éxito y FAILURE en caso de que la función no sea hallada . ¡Deberá comprobar ese valor de retorno ! Si devuelve SUCCESS , debe usted ocuparse de destruir el pval devuelto ( o devolverlo como el valor de retorno de su función ) . Si devuelve FAILURE , el valor de valret no está definido y no debe tocarlo .

Todas las funciones internas que llaman a funciones de usuario deben ser reentrantes . Entre otras cosas , esto quiere decir que no se utilicen variables globales ni estáticas .

call_user_function( ) lleva 6 argumentos :

HashTable *tabla_funciones

Esta es la matriz asociativa en la que se buscará la función .

pval *objeto

Este es un puntero a un objeto sobre el que se invoca la función . Deberá valer NULL si se llama a una función global . Si no es NULL ( es decir , si apunta a un objeto ) , el argumento tabla_funciones se ignora y se toma su valor a partir de la codificación del objeto . El objeto *puede* ser modificado por dicha función ( ésta accede a él a través de $this ) . Si por alguna razón no desea que eso ocurra , envíe entonces una copia del objeto .

pval *nombre_func

El nombre de la función a llamar . Debe ser un pval de tipo IS_STRING , con nombre_func.str.val y nombre_func.str.len fijados a los valores apropiados . El nombre_func es modificado por call_user_function( ) , que lo convierte a minúsculas . Si necesita preservar el nombre , envíe una copia del mismo .

pval *valret

Un puntero a una estructura pval , en la que se guarda el valor de returno de la función . Hay que asignar espacio a la estructura previamente , porque la función call_user_function( ) NO lo asigna por misma .

int num_params

El número de parámetros que se pasan a la función .

pval *params[]

Una matriz de punteros a los valores que se pasarán como argumentos a la función . El primer argumento está en el elemento 0 , el segundo en el elemento 1 , etc . La matriz es una matriz de punteros a pval . Los punteros se envían tal cual a la función , lo que quiere decir que si la función modifica sus argumentos , se modifican los valores originales ( paso por referencia ) . Si no desea ese comportamiento , pase una copia .