문제

C에서 PHP 확장자를 작성하면 사용자 랜드 개체를 변환하고 싶습니다.IS_OBJECT) 문자열에 __toString() 하나가 있고 그렇지 않으면 실패합니다. 무엇을 사용해야합니까? 나는 다른 것이 필요하지 않습니다 zval 출력에서, 그냥 a char *.

zval *zo;

switch (Z_TYPE_P(zo)) {
case IS_STRING:
    ... Z_STRVAL_P(zo) ...
    break;
case IS_OBJECT:
    ... ???(zo) ...
    break;
...
}
도움이 되었습니까?

해결책

반사 모듈은 같은 기능을 수행합니다

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

그런 다음 z_strval_p ()로 char*를 추출합니다.
그러나 나는 추측 당신은 또한 사용할 수 있습니다

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에서 구현되었습니다. 당신은 그것이 당신이 원하는 것을 실제로 할 것인지 확인하고 싶을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top