Bir PHP uzantısı C + + nesneleri dizisi döndürür nasıl

1 Cevap php

Benim PHP uzantısı nesneler bir dizi dönmek olması gerekiyor, ama ben bunu nasıl anlamaya görünüyor olamaz.

Ben bir Graph nesne C + + yazdım. Graph.getNodes(), bir std::map<int, Node*> döndürür. İşte şu anda sahip kodu:

struct node_object {
        zend_object std;
        Node *node;
};

zend_class_entry *node_ce;

o zaman

PHP_METHOD(Graph, getNodes)
{
        Graph *graph;
        GET_GRAPH(graph, obj) // a macro I wrote to populate graph

        node_object* n;
        zval* node_zval;

        if (obj == NULL) {
                RETURN_NULL();
        }   

        if (object_init_ex(node_zval, node_ce) != SUCCESS) {
                RETURN_NULL();
        }   


        std::map nodes = graph->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->node = i->second;
                add_index_zval(return_value, i->first, node_zval);
        }

        php_printf("]");
}

I çalıştırdığınızda php -r '$g = new Graph(); $g->getNodes();' Ben çıktı almak

XX]Segmentation fault

meaning the getNodes() function loops successfully through my 2-node list, returns, o zaman segfaults. What am I doing wrong?

1 Cevap

Ben sadece MAKE_STD_ZVAL (node_zval) gerekiyordu. Bu kod ile ikincil bir konu ben bu nedenle her geçen zval üzerine ve aynı nesnenin tam bir dizi ile biten, bu zval işaretçi yeniden olmasıydı. Bu sorunu çözmek için, ben her döngü için node_zval başlatılamıyor. İşte son kodu bulunuyor:

PHP_METHOD(Graph, getNodes)
{
        Graph *graph;
        GET_GRAPH(graph, obj) // a macro I wrote to populate graph

        node_object* n;
        zval* node_zval;

        if (obj == NULL) {
                RETURN_NULL();
        }   

        std::map nodes = graph->getNodes();

        array_init(return_value);

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

                n = (node_object*) zend_object_store_get_object(node_zval TSRMLS_CC);
                n->node = i->second;
                add_index_zval(return_value, i->first, node_zval);
        }
}