2012-12-31 11 views
9

Sto provando a scrivere un'estensione per php5.4 che sostanzialmente racchiude una classe molto semplice in CPP.Scrivendo un'estensione C++ per PHP 5.4, il codice di esempio è obsoleto

Questo è per scopi didattici.

Trovo il modo di farlo in php5.4 è cambiato da PHP5.3

Dove posso trovare la documentazione su come farlo? O meglio ancora, esempio di codice, qualsiasi altra estensione che comprenda le classi CPP e funzioni in php5.4

Ad esempio, cosa funzionava e non lo è più. Tratto da http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/

zend_object_value car_create_handler(zend_class_entry *type TSRMLS_DC) 
{ 
    zval *tmp; 
    zend_object_value retval; 

    car_object *obj = (car_object *)emalloc(sizeof(car_object)); 
    memset(obj, 0, sizeof(car_object)); 
    obj->std.ce = type; 

    ALLOC_HASHTABLE(obj->std.properties); 
    zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); 
    zend_hash_copy(obj->std.properties, &type->default_properties, 
     (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); 

    retval.handle = zend_objects_store_put(obj, NULL, 
     car_free_storage, NULL TSRMLS_CC); 
    retval.handlers = &car_object_handlers; 

    return retval; 
} 

La linea zend_hash_copy(obj->std.properties, &type->default_properties, (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); falliranno come istanza di struttura type (dimenticato la sua definizione) non ha più il membro default_properties

+3

probabilmente la miglior risorsa è il codice sorgente PHP5.4 –

+0

@ Mark Baker non sono grandi in CPP, se v'è una specifica estensione che già lo fa, sarebbe di grande aiuto. Altrimenti, sì, farò esattamente quello che suggerisci –

+0

http://php.net/manual/en/internals2.structure.php? –

risposta

6

Fa le informazioni nella pagina informativa PHP wiki?

In particolare, per affrontare il vostro zend_hash_copy(obj->std.properties, &type->default_properties, (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); esempio, essi suggeriscono la seguente:

#if PHP_VERSION_ID < 50399 
    zend_hash_copy(tobj->std.properties, &(class_type->default_properties), 
     (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*)); 
#else 
    object_properties_init(&tobj->std, class_type); 
#endif