PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zend api - call_user_function_ex()



micha
04-04-2004, 19:11
Hi,

ich versuche mich gerade an einem Modul für php4.
Dazu habe ich erst mal eine generelle Frage; wenn ich eine Funktion benötige, die schon in einem anderen Modul gelöst ist (z.B. parse_url), dann wäre es doch IMHO sinnvoll, diese Funktion auch zu nutzen. Das Problem dabei ist, dass die meisten Funktionen nur als php Funktionen deklariert sind, um bei parse_url zu bleiben:



PHP_FUNCTION(parse_url)


Das Makro expandiert sieht dann so aus:



void zif_parse_url(int ht, zval * return_value, zval * this_ptr,
int return_value_used, zend_executor_globals * executor_globals);


Am Besten wäre es, wenn noch eine zusätzliche Funktion wie folgt existieren würde:



zval *php_parse_url(char *dsn TSMRLS_DC);


Mhm, das ist jedoch leider nicht der Fall ;)
Die einzige Möglichkeit, die ich gefunden habe, um so eine Funktion aufzurufen, is call_user_function_ex(). Ich bin mir nur nicht sicher, ob das dafür gedacht ist, deshalb wäre ich hier für einen Tipp dankbar (auch um andere Möglichkeiten, falls es die gibt) !

Mein zweites Problem tritt beim Versuch diese Funktion einzusetzen auf, hier mal der code:



/**
* Returns an assoc array with the values extracted from the given dsn string.
*
* \param dsn a string containing the dsn.
*/
PHP_FUNCTION(php_creole_parse_dsn)
{
zval *z_dsn; /* dsn parameter */
zval *z_info; /* return value from parse_url */
zval *func, **args[1]; /* function name and arguments to parse_url */
TSRMLS_FETCH();

if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &z_dsn) == FAILURE) {
WRONG_PARAM_COUNT;
}

MAKE_STD_ZVAL(func);
ZVAL_STRING(func, "parse_url", 1);
args[0] = &z_dsn;

if (call_user_function_ex(CG(function_table), NULL, func,
&z_info, 1, args, 0, NULL TSRMLS_CC) == FAILURE) {
zend_error(E_ERROR, "function call to '%s' failed !", Z_STRVAL_P(func));
}

if (array_init(return_value) == FAILURE) {
zend_error(E_ERROR, "cannot initialize array !");
}

add_assoc_null(return_value, "phptype");
add_assoc_null(return_value, "username");
add_assoc_null(return_value, "password");
add_assoc_null(return_value, "protocol");
add_assoc_null(return_value, "hostspec");
add_assoc_null(return_value, "port");
add_assoc_null(return_value, "socket");
add_assoc_null(return_value, "database");
}


Das Module stürzt bei dem ersten Aufruf von "add_assoc_null" ab.
Das Eigenartige ist, das es nicht abstürzt, wenn ich das Array vor dem Aufruf von "call_user_function_ex" initialisiere. Das müsste doch heißen, dass call_user_function_ex den Parameter return_value in irgendeiner Weise modifiziert ?
Kennt sich einer von Euch damit aus, und könnte mir auf die Sprünge helfen ?
Nen Link zu weiterführender Dokumentation wäre auch hilfreich (http://www.zend.com/zend/api.php hab ich schon durch).

Thx,
micha