Пишу модуль 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 к какой-то структуре я не могу.
Может быть можно создать какую-нибудь "структуру-пустышку", чтобы приводить результат к этой структуре? А само ее содержание мне было бы не важно, ведь я все равно общаюсь с объектом через магические методы. Как такое провернуть?