Задать вопрос

Как получить ранее созданный объект в Zend engine, зная его HANDLE?

Пишу модуль php. Допустим, я создал объект в php:
$obj = new MyExtObject('myExtObjectName1');
echo $obj ->objectName(); // Выведет: myExtObjectName1


В зенде в список объектов я скидываю handle созданного объекта и присвоенное ему имя:
ZEND_METHOD(my_ext_class, __construct)
{
    /* ... */
    int zHandle = Z_OBJVAL_P( getThis() ).handle;
    objectsHashMap.insert(zHandle, objectName);
}


Как теперь, зная handle моего $obj, получить объект в PHP? Ну, т.е. в модуле я должен написать функцию, допустим ext_get_created_object() и нужно, чтобы эта функция вернула ссылку на ранее созданный объект, чтобы с ним можно было работать. Примерно это должно выглядеть так:
$createdObject = ext_get_created_object( 'myExtObjectName1' );
echo $createdObject->objectName(); // Должно вывести: myExtObjectName1


Я попробовал сделать так:
PHP_FUNCTION(ext_get_created_object) {
    const char* objectName;
    int objectName_len;

    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &objectName, &objectName_len)) {
        return;
    }

    int zHandle = -1;

    // тут происходит поиск handle объекта по его имени
    foreach( pqObject pqo, objectsHashMap.values() ) {
        if(pqo.qo->objectName == objectName) {
            zHandle = pqo.zHandle;
            break;
        }
    }

    // тут в пых должна была вернутся ссылка, но ЧТО-ТО ПОШЛО НЕ ТАК :)
    if(zHandle > -1) {
        zval *retval = (zval*) zend_object_store_get_object_by_handle(zHandle TSRMLS_CC);
        RETURN_ZVAL(retval, 1, 0);
    }
    else {
        return;
    }
}

при запуске кода php.exe крашится... zHandle 100% определяется правильно, проверял функцией RETURN_LONG(zHandle). Что я делаю не так? Почему код не срабатывает? Может нужно не к zval* приводить? Если нет, то к чему?

п.с. у меня нет описанной структуры для создаваемого объекта, сам объект - класс на cpp, а пых общается с ним через zend-методы __set, __get и __call, т.е. привести результат функции zend_object_store_get_object_by_handle к какой-то структуре я не могу.
Может быть можно создать какую-нибудь "структуру-пустышку", чтобы приводить результат к этой структуре? А само ее содержание мне было бы не важно, ведь я все равно общаюсь с объектом через магические методы. Как такое провернуть?
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы