2010-01-15 8 views
0

En écrivant une extension PHP en C, je veux convertir un objet userland (IS_OBJECT) en une chaîne via __toString() s'il en a un, et échouer sinon. Que devrais-je utiliser? Je n'ai pas besoin d'un autre zval en sortie, juste un char *.Extension PHP: convertir un objet en chaîne avec __toString()

zval *zo; 

switch (Z_TYPE_P(zo)) { 
case IS_STRING: 
    ... Z_STRVAL_P(zo) ... 
    break; 
case IS_OBJECT: 
    ... ???(zo) ... 
    break; 
... 
} 

Répondre

1

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 alors vous extraire le char * avec Z_STRVAL_P().
Mais je suppose que 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 pourriez vouloir vérifier si elle fait vraiment ce que vous voulez

+0

Merci pour la réponse. A la fin je me suis contenté de 'zend_make_printable_zval' (défini dans Zend/zend.c): l'extrait SPL est moche, et' zend_std_cast_object_tostring' inclut un comportement qui casse les exigences que je n'ai pas mentionnées dans ma question (désolé). –

Questions connexes