2010-06-29 5 views

Répondre

9

Vous pouvez écrire une extension et regarder BG(user_shutdown_function_names). Probablement plus facile est de faire un wrapper pour register_shutdown_function qui enregistre les fonctions d'arrêt à un tableau et l'appeler à la place.

(non testé)

#include "ext/standard/basic_functions.h" 
//usual include suspects here 

typedef struct _php_shutdown_function_entry { 
    zval **arguments; 
    int arg_count; 
} php_shutdown_function_entry; 

static void _shutdown_function_dtor(php_shutdown_function_entry *shutdown_function_entry) /* {{{ */ 
{ 
    int i; 

    for (i = 0; i < shutdown_function_entry->arg_count; i++) { 
     zval_ptr_dtor(&shutdown_function_entry->arguments[i]); 
    } 
    efree(shutdown_function_entry->arguments); 
} 

static int _build_shutdown_array(php_shutdown_function_entry *entry, zval *arr TSRMLS_DC) 
{ 
    zval *inner; 
    zval *args; 
    int i; 

    array_init(inner); 
    array_init(args); 
    Z_ADDREF_P(entry->arguments[0]); 
    add_assoc_zval(inner, "callback", entry->arguments[0]); 

    for (i = 1; i < entry->arg_count; i++) { 
     Z_ADDREF_P(entry->arguments[i]); 
     add_next_index_zval(args, entry->arguments[i]); 
    } 
    add_assoc_zval(inner, "arguments", args); 

    add_next_index_zval(arr, inner); 
} 

PHP_FUNCTION(list_shutdown_functions) 
{ 
    if (zend_parse_parameters_none() == FAILURE) 
     return; 

    if (!BG(user_shutdown_function_names)) { 
     ALLOC_HASHTABLE(BG(user_shutdown_function_names)); 
     zend_hash_init(BG(user_shutdown_function_names), 0, NULL, 
      (void (*)(void *)) _shutdown_function_dtor, 0); 
    } 

    array_init(return_value); 

    zend_hash_apply_with_argument(BG(user_shutdown_function_names), 
     (apply_func_arg_t) _build_shutdown_array, return_value TSRMLS_CC); 
} 
+0

wow, quelle réponse en profondeur. la plupart du temps, PHP a déjà une fonction au niveau PHP pour faire les choses, mais dans ce cas, ce n'est pas le cas, et pourtant vous avez toujours trouvé une solution! –

2

En plus de vous suivre, non. La liste des noms de fonctions enregistrés n'est pas exposée à vos scripts PHP. Si vous êtes ouvert à étendre PHP lui-même (ce serait une tâche simple), alors voir la réponse d'Artefacto.

Questions connexes