2010-01-15 47 views
0

C編寫PHP擴展,我想通過__toString()一個用戶態對象(IS_OBJECT)將字符串轉換(如果有),以及否則失敗。我應該使用什麼? 我不需要輸出zval,只需char *PHP擴展:將對象轉換爲字符串__toString()

zval *zo; 

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

回答

1

反射模塊做類似

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 */ 
} 

然後你提取的char *與Z_STRVAL_P()。
但我猜也可以使用

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()中的Zend/zend_object_handlers.c實現。你可能想檢查它是否真的做到了你想要的東西

+0

感謝您的回答。最後,我用'zend_make_printable_zval'(在Zend/zend.c中定義)解決了這個問題:SPL代碼片段很難看,'zend_std_cast_object_tostring'包含了違反我在問題中沒有提到的要求的行爲(對此很抱歉)。 –