Extension PHP: convertir un objet en chaîne avec __toString ()
Question
Écrivant une extension PHP en C, je souhaite convertir un objet Userland (IS_OBJECT
) à une chaîne à travers __toString()
s'il en a un et échouez autrement. Que dois-je utiliser? Je n'en ai pas besoin d'un autre zval
sur la sortie, juste un char *
.
zval *zo;
switch (Z_TYPE_P(zo)) {
case IS_STRING:
... Z_STRVAL_P(zo) ...
break;
case IS_OBJECT:
... ???(zo) ...
break;
...
}
La solution
Le module de réflexion fait quelque chose comme
ZVAL_STRINGL(&fname, "__tostring", sizeof("__tostring") - 1, 1);
result= call_user_function_ex(NULL, &object, &fname, &retval_ptr, 0, NULL, 0, NULL TSRMLS_CC);
zval_dtor(&fname);
if (result == FAILURE) {
_DO_THROW("Invocation of method __toString() failed");
/* Returns from this function */
}
Et puis vous extrairez le char * avec z_strval_p ().
Mais je deviner Vous pouvez également utiliser
case IS_OBJECT:
if ( SUCCESS==zend_std_cast_object_tostring(uservar, uservar, IS_STRING TSRMLS_CC) ) {
int len = Z_STRLEN_P(uservar);
char* pValue = Z_STRVAL_P(uservar);
...
}
zend_std_cast_object_tostring () est implémenté dans zend / zend_object_handlers.c. Vous voudrez peut-être vérifier si cela fait vraiment ce que vous voulez
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow