метод расширения php не возвращается почему? - PullRequest
0 голосов
/ 13 сентября 2011

Вот php_ex.cc.Когда я компилирую библиотеку .so, метод retur () не работает.ЗАЧЕМ?У меня нет ошибок, но он должен напечатать «тест», и это не так.нужна помощь. THX

[php_ex.cc]

#include "php_vehicles.h"
#include "car.hpp"

zend_object_handlers car_object_handlers;
zend_object_handlers car2_object_handlers;
struct car_object {
    zend_object std;
    Car *car;

};
struct car2_object {
    zend_object std1;
    Car2 *car2;

};
zend_class_entry *car_ce;
zend_class_entry *car2_ce2;
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);

    efree(obj);
}
void car2_free_storage(void *object TSRMLS_DC)
{
    car2_object *obj2 = (car2_object *)object;
    delete obj2->car2; 

    zend_hash_destroy(obj2->std1.properties);
    FREE_HASHTABLE(obj2->std1.properties);

    efree(obj2);
}
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;
}
zend_object_value car2_create_handler(zend_class_entry *type TSRMLS_DC)
{
    zval *tmp;
    zend_object_value retval;

    car2_object *obj2 = (car2_object *)emalloc(sizeof(car2_object));
    memset(obj2, 0, sizeof(car2_object));
    obj2->std1.ce = type;

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

    retval.handle = zend_objects_store_put(obj2, NULL,
        car2_free_storage, NULL TSRMLS_CC);
    retval.handlers = &car2_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;

}
PHP_METHOD(Car, shift)
{
}
PHP_METHOD(Car, accelerate)
{
    Car *car;
    char *strr=NULL;

    int strr_len;
     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &strr, &strr_len) == FAILURE) {
        RETURN_NULL();
    }
    car_object *obj = (car_object *)zend_object_store_get_object(
        getThis() TSRMLS_CC);
    car = obj->car;
    if (car != NULL) {
        std::string s(strr);
        car->accelerate(s);
       RETURN_STRING(car->accelerate(s).c_str(),1);
    }

}
PHP_METHOD(Car, brake)
{
}
PHP_METHOD(Car, getCurrentSpeed)
{
    Car *car;
    car_object *obj = (car_object *)zend_object_store_get_object(
        getThis() TSRMLS_CC);
    car = obj->car;
    if (car != NULL) {
        RETURN_LONG(car->getCurrentSpeed());
    }
    RETURN_NULL();

}
PHP_METHOD(Car, getCurrentGear)
{
}
PHP_METHOD(Car2, __construct)
{

    Car2 *car2 = NULL;
    zval *object = getThis();

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "", NULL) == FAILURE) {
        RETURN_NULL();
    }

    car2 = new Car2();
    car2_object *obj = (car2_object *)zend_object_store_get_object(object TSRMLS_CC);
    obj->car2 = car2;

}
PHP_METHOD(Car2, retur)
{
    Car2 *car2;
    car2_object *obj = (car2_object *)zend_object_store_get_object(
        getThis() TSRMLS_CC);
    car2 = obj->car2;
    if (car2 != NULL) {
        (car2->retur());
    }

}
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}
};
function_entry car2_methods[] = {
PHP_ME(Car2,  retur,  NULL, ZEND_ACC_PUBLIC)
   {NULL, NULL, NULL}
};
PHP_MINIT_FUNCTION(vehicles)
{
   zend_class_entry ce,ce2;
    INIT_CLASS_ENTRY(ce, "Car", car_methods);
     INIT_CLASS_ENTRY(ce2, "Car2", car2_methods);
    car_ce = zend_register_internal_class(&ce TSRMLS_CC);
    car_ce->create_object = car_create_handler;

     car2_ce2 = zend_register_internal_class(&ce2 TSRMLS_CC);
    car2_ce2->create_object = car2_create_handler;
    memcpy(&car_object_handlers,
        zend_get_std_object_handlers(), sizeof(zend_object_handlers));
    car_object_handlers.clone_obj = NULL;

     memcpy(&car2_object_handlers,
        zend_get_std_object_handlers(), sizeof(zend_object_handlers));
    car2_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),        /* MINIT */
    NULL,        /* MSHUTDOWN */
    NULL,        /* RINIT */
    NULL,        /* RSHUTDOWN */
    NULL,        /* MINFO */
#if ZEND_MODULE_API_NO >= 20010901
    PHP_VEHICLES_EXTVER,
#endif
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_VEHICLES
extern "C" {
ZEND_GET_MODULE(vehicles)
}
#endif

Вот примери это методы работают.

1 Ответ

0 голосов
/ 13 сентября 2011

Если ваш метод retur действительно пишет в стандартный вывод, вы должны заметить, что вывод PHP, в общем, не совпадает с выводом.

Для CLI SAPI (например), это так, но даже тогда, записывая напрямую в стандартный вывод, вы будете обходить буферизацию вывода PHP.

Вместо этого вы должны использовать php_printf или PHPWRITE.

...