Frage

Wenn ich eine PHP -Erweiterung in C schreibe, möchte ich ein Userland -Objekt konvertieren (IS_OBJECT) zu einer Saite durch __toString() Wenn es einen hat und sonst scheitern. Was soll ich verwenden? Ich brauche keinen anderen zval Bei Ausgang nur a char *.

zval *zo;

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

Lösung

Das Reflexionsmodul macht so etwas wie

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

Und dann würden Sie das Zeichen* mit z_strval_p () extrahieren.
Aber ich erraten Sie könnten auch verwenden

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 () ist in Zend/Zend_Object_handlers.c implementiert. Vielleicht möchten Sie überprüfen, ob es wirklich das tut, was Sie wollen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top