Я работаю над переносом C ++ API в PHP с использованием SWIG.Я в основном там, но у меня проблемы с функцией, которая возвращает вектор.Заголовок выглядит примерно так:
#include <vector>
namespace STF
{
class MyClass
{
public:
const std::vector<MyOtherClass> &getList();
};
}
Файл интерфейса выглядит следующим образом:
%include <std_vector.i>
%import "STF_MyOtherClass.i"
%{
#include "STF_MyOtherClass.h"
#include "STF_MyClass.h"
%}
%include "STF_MyClass.h"
Кажется, я могу нормально вызывать функцию, но вместо этого она возвращает ресурс PHPобъекта.В частности, это ресурс типа: "_p_std__vectorT_STF__MyClass_t".
Как я могу получить это, чтобы вернуть объект, который я могу перебрать (желательно с циклом foreach) или как я могу перебрать этот ресурс?
Обновление:
Я работал над решением, основанным на том, что я прочитал здесь: http://permalink.gmane.org/gmane.comp.programming.swig/16817
В основном я пытаюсь преобразоватьvector в массив python:
%typemap(out) std::vector<STF::MyOtherClass>
{
array_init( return_value );
std::vector<STF::MyOtherClass>::iterator itr;
itr = $1.begin();
for( itr; itr != $1.end(); itr++ )
{
zval* tmp;
MAKE_STD_ZVAL( tmp );
SWIG_SetPointerZval( tmp, &*itr, $descriptor(STF::MyOtherClass*), 2 );
add_next_index_zval( return_value, tmp );
}
}
Это очень близко к работе.Я установил точку останова внутри кода оболочки в SWIG_ZTS_SetPointerZval.Когда он идет на инициализацию объекта, он делает zend_lookup_class для «stf__myotherclass», который завершается ошибкой (он не находит clasS).Я не уверен, почему он не может найти класс.