PHP拡張機能:__toString()でオブジェクトを文字列に変換します

StackOverflow https://stackoverflow.com/questions/2071145

  •  20-09-2019
  •  | 
  •  

質問

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