开发者

php extension method not returned why?

Here is the php_ex.cc . When I compile my .so library the retur() method is not working. WHY? I have no errors, but It should print "test" and it doesn;t . need some help.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

Here is th [example.cc]

void Car2::retur()
{
    cout<<"YOU ARE IN CLASS NR 2"<<endl;
}

I would like to mention that class Car and it's methods are working.


If your retur method is indeed writing to stdout, you should note that PHP's output, in general, does not coincide com stdout.

For the CLI SAPI (for instance), it does, but even then, by writing directly to stdout you will be bypassing PHP's output buffering.

You have to use php_printf or PHPWRITE instead.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜