2

我需要让我的 PHP 扩展返回一个对象数组,但我似乎无法弄清楚如何做到这一点。

我有一个Graph用 C++ 编写的对象。Graph.getNodes()返回一个std::map<int, Node*>。这是我目前的代码:

结构节点对象{
        zend_object 标准;
        节点*节点;
};

zend_class_entry *node_ce;

然后

PHP_METHOD(图形,getNodes)
{
        图*图;
        GET_GRAPH(graph, obj) // 我编写的用于填充图形的宏

        节点对象* n;
        zval* node_zval;

        如果(obj == NULL){
                RETURN_NULL();
        }   

        如果(object_init_ex(node_zval,node_ce)!=成功){
                RETURN_NULL();
        }   


        std::map 节点 = 图->getNodes();

        array_init(return_value);

        for (std::map::iterator i = nodes.begin(); i != nodes.end(); ++i) {
                php_printf("X");
                n = (node_object*) zend_object_store_get_object(node_zval TSRMLS_CC);
                n->节点= i->秒;
                add_index_zval(return_value, i->first, node_zval);
        }

        php_printf("]");
}

当我运行时,php -r '$g = new Graph(); $g->getNodes();'我得到输出

XX]Segmentation fault

这意味着 getNodes() 函数成功循环通过我的 2 节点列表,返回,然后是段错误。我究竟做错了什么?

4

1 回答 1

5

我只需要 MAKE_STD_ZVAL(node_zval)。这段代码的第二个问题是我重用了这个 zval 指针,因此覆盖了以前的每个 zval 并最终得到一个充满相同对象的数组。为了解决这个问题,我为每个循环初始化 node_zval。这是最终的代码:

PHP_METHOD(图形,getNodes)
{
        图*图;
        GET_GRAPH(graph, obj) // 我编写的用于填充图形的宏

        节点对象* n;
        zval* node_zval;

        如果(obj == NULL){
                RETURN_NULL();
        }   

        std::map 节点 = 图->getNodes();

        array_init(return_value);

        for (std::map::iterator i = nodes.begin(); i != nodes.end(); ++i) {
                MAKE_STD_ZVAL(node_zval);
                如果(object_init_ex(node_zval,node_ce)!=成功){
                        RETURN_NULL();
                }   

                n = (node_object*) zend_object_store_get_object(node_zval TSRMLS_CC);
                n->节点= i->秒;
                add_index_zval(return_value, i->first, node_zval);
        }
}
于 2010-05-19T21:02:17.720 回答