繁体   English   中英

在PHP扩展中包装C ++类

[英]Wrapping C++ Classes in a PHP Extension

我正在按照教程将c ++类包装在php扩展中。 我正在使用wamp服务器和php 5.4.16。

PHP_METHOD(Car, __construct)PHP_METHOD(Car, __construct)

似乎在致电

car_object *obj = ( car_object *) zend_object_store_get_object ( object TSRMLS_CC );

obj ->car不是有效地址。 当注释行obj ->car = car ,wamp不会关闭。 所以我猜obj ->car无效或合法地址。

下面是我的代码:

Vehicles.cc:

#include "php.h"
#include "car.h"

#define PHP_VEHICLES_EXTNAME  "vehicles"
#define PHP_VEHICLES_EXTVER   "0.1"

zend_object_handlers car_object_handlers;

struct car_object {
    zend_object std;
    Car *car;
};


zend_class_entry *car_ce;


void car_free_storage(void *object TSRMLS_DC)
{
    car_object *obj = (car_object *)object;
    delete obj->car; 

    zend_hash_destroy(obj->std.properties);
    FREE_HASHTABLE(obj->std.properties);

delete obj->car;
    efree(obj);
}

zend_object_value car_create_handler(zend_class_entry *type TSRMLS_DC)
{
    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);

#if PHP_VERSION_ID < 50399
zval *tmp;
    zend_hash_copy(obj->std.properties, &type->default_properties,                                                                                                                                                    (copy_ctor_func_t) zval_add_ref, (void *)&tmp, sizeof(zval *));

    #else
        object_properties_init(&(obj->std), type);
    #endif


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

    return retval;
}

PHP_METHOD(Car, __construct)
{
long maxGear;
    Car *car = NULL;
    zval *object = getThis();

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &maxGear) == FAILURE) {
        RETURN_NULL();
    }

    car = new Car(maxGear);    
car_object *obj = ( car_object *) zend_object_store_get_object(object TSRMLS_CC                 );

//obj->car = car; 

}

...
...
zend_function_entry car_methods[] = {
    PHP_ME(Car,  __construct,     NULL, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
    PHP_ME(Car,  shift,           NULL, ZEND_ACC_PUBLIC)
    PHP_ME(Car,  accelerate,      NULL, ZEND_ACC_PUBLIC)
    PHP_ME(Car,  brake,           NULL, ZEND_ACC_PUBLIC)
    PHP_ME(Car,  getCurrentSpeed, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(Car,  getCurrentGear,  NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};


PHP_MINIT_FUNCTION(vehicles)
{
    zend_class_entry ce;

    INIT_CLASS_ENTRY(ce, "Car", car_methods);
    car_ce = zend_register_internal_class(&ce TSRMLS_CC);
    car_ce->create_object = car_create_handler;
    memcpy(&car_object_handlers, zend_get_std_object_handlers(),                    sizeof(zend_object_handlers));
    car_object_handlers.clone_obj = NULL;
    return SUCCESS;
}

zend_module_entry vehicles_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    PHP_VEHICLES_EXTNAME,
    NULL,                  /* Functions */
    PHP_MINIT(vehicles),
    NULL,                  /* MSHUTDOWN */
    NULL,                  /* RINIT */
    NULL,                  /* RSHUTDOWN */
    NULL,                  /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP_VEHICLES_EXTVER,
#endif
    STANDARD_MODULE_PROPERTIES
};


ZEND_GET_MODULE ( vehicles );

car.h car.cc与教程中的相同。

我想我缺少了一些东西。 可能在函数car_create_handler对“ object_properties_init(&(obj->std), type); ”的调用不正确。

谢谢你的帮助/。

似乎在函数car_free_storage中,您两次调用delete obj-> car。 这可能不是一个好主意。

此外,当我最近在寻找另一个PHP模块时,我发现obj-> std.properties并不总是设置为有效地址。 因此,在将其传递给zend_hash_destroy之前,可能值得检查它是否不为0。 我的代码是:

if(obj->std.properties){
    zend_hash_destroy(obj->std.properties);
    FREE_HASHTABLE(obj->std.properties);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM