代码之家  ›  专栏  ›  技术社区  ›  just somebody

php扩展名:使用u toString()将对象转换为字符串

  •  0
  • just somebody  · 技术社区  · 15 年前

    在C语言中编写一个PHP扩展,我想转换一个userland对象( IS_OBJECT )通过一个字符串 __toString() 如果它有一个,否则失败。我应该使用什么? 我不需要别的 zval 在输出端,只有一个 char * .

    zval *zo;
    
    switch (Z_TYPE_P(zo)) {
    case IS_STRING:
        ... Z_STRVAL_P(zo) ...
        break;
    case IS_OBJECT:
        ... ???(zo) ...
        break;
    ...
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   VolkerK    15 年前

    反射模块的功能如下

    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中实现。您可能需要检查它是否真的满足您的需要。