2010-06-29 3 views

답변

9

연장을 작성하여 BG(user_shutdown_function_names)을 볼 수 있습니다. 아마 더 쉬울 수도 있습니다 어떤 배열에 종료 기능을 저장하고 대신 호출 register_shutdown_function에 대한 래퍼를 만드는 것입니다.

(테스트되지 않은)

#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

와우, 무엇에 대한 깊이있는 대답. 대부분의 시간에 PHP는 이미 PHP 수준에서 함수를 사용하여 작업을 수행하지만이 경우에는 그렇지 않습니다. 그러나 아직 해결 방법은 있습니다. –

2

자신을 추적하는 것 외에는 없습니다. 등록 된 함수 이름 목록은 PHP 스크립트에 노출되어 있지 않습니다. PHP 자체를 확장 할 수 있다면 (이것은 간단한 작업이 될 것입니다.) Artefacto의 대답을 참조하십시오.

관련 문제