php.net/get_defined_functions and php.net/get_class_methods not good enough for you? ;-)
What's the long term aim? --Wez. On Tue, 19 Nov 2002, Marcus [iso-8859-1] Börger wrote: > I have experimented with the code below. > > The main thing is to introduce a function that can return a list of > all available functions (this is a first step to something bigger...). > > At this point i have three problems: > 1) When i create a function it is shown in the result :-) > 2) When i create a class it is shown twice (same goes with methods) :-( > 3) When i look for internal classes there is the problem that the the > function entries > do not know there scope (class). In other words the connection between > zend_class_entry.function_table ->> zend_function is a one way link > because zend_function.scope==NULL :-(( > > For the moment: > I know that i can fetch the scop easily if it is missing by using > apply_func_args_t type functions instead of apply_func_arg_t > and passing the scope to add_function_info. > But for me it seems to be a problem in the zend engine. > > Example 1: > [marcus@zaphod php4-HEAD]$ php -r 'class zz_c { function zz_c() > {echo"zz_inst\n";}; static function zz_sf() {};};$o=new > zz_c();$l=function_list();sort($l);var_dump($l);' | grep zz > zz_inst > string(10) "class zz_c" > string(10) "class zz_c" > string(18) "static zz_c::zz_sf" > string(18) "static zz_c::zz_sf" > string(2) "zz" > string(10) "zz_c::zz_c" > string(10) "zz_c::zz_c" > > Example 2: searching for methods of class defined in ext/xslt > [marcus@zaphod php4-HEAD]$ php -r 'var_dump(function_list());' | grep domnode > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > string(7) "domnode" > > > /* {{{ add_function_info */ > static int add_function_info(zend_function *func, zval *return_value TSRMLS_DC) > { > char *f; > if (func->internal_function.handler != > zif_display_disabled_function) { > /* ?? internal_function->type = ZEND_INTERNAL_FUNCTION; */ > if (func->common.scope) { > if (func->common.is_static) { > spprintf(&f, 0, "static %s::%s", > func->common.scope->name, func->common.function_name); > } else { > spprintf(&f, 0, "%s::%s", > func->common.scope->name, func->common.function_name); > } > } else { > f = estrdup(func->common.function_name); > } > add_next_index_string(return_value, f, 0); > } > return 0; > } > /* }}} */ > /* {{{ add_class_info */ > static int add_class_info(zend_class_entry **zclass, zval *return_value > TSRMLS_DC) > { > char *f; > spprintf(&f, 0, "class %s", (*zclass)->name); > add_next_index_string(return_value, f, 0); > zend_hash_apply_with_argument(&(*zclass)->function_table, > (apply_func_arg_t)add_function_info, return_value TSRMLS_CC); > return 0; > } > /* }}} */ > /* {{{ proto array function_list() > Returns an array of all php functions */ > PHP_FUNCTION(function_list) > { > if (ZEND_NUM_ARGS()) { > WRONG_PARAM_COUNT; > } > > if (array_init(return_value) == FAILURE) { > php_error_docref(NULL TSRMLS_CC, E_ERROR, "Unable to > initialize array"); > RETURN_FALSE; > } > > zend_hash_apply_with_argument(EG(function_table), > (apply_func_arg_t)add_function_info, return_value TSRMLS_CC); > zend_hash_apply_with_argument(EG(class_table), > (apply_func_arg_t)add_class_info, return_value TSRMLS_CC); > } > /* }}} */ > > > > ------------------->>> mailto:[EMAIL PROTECTED] <<<------------------ > "We are animals among animals, all children of matter, > save that we are the more disarmed. But since, unlike animals, > we know that we must die, let us prepare for that moment > by enjoying the life that has been given us by chance and for chance." > Umberto Eco, The island of the day before > --------------------->>> http://marcus-boerger.de <<<--------------------- > -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php