2010-06-29 17 views

cevap

9

Bir uzantı yazıp BG(user_shutdown_function_names)'a bakabilirsiniz. Muhtemelen daha kolay register_shutdown_function için bir kapama yapmak için kapatma fonksiyonlarını bazı dizilere kaydeder ve bunun yerine çağırır.

(Test edilmemiş)

#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

vay, ne derinlemesine bir cevap. Çoğu zaman PHP zaten bir şeyler yapmak için PHP seviyesinde bir işleve sahiptir, ama bu durumda değil, yine de hala bir çözüm ile geldi! –

2

Takip etmek dışında, hayır. Kayıtlı fonksiyon isimlerinin listesi PHP betiklerine açık değildir. Eğer PHP'nin kendisini genişletmeye açıksanız (bu basit bir iş olacaktır) Artefacto'un cevabına bakınız.

İlgili konular