2011-09-13 72 views
0

這是php_ex.cc。當我編譯我的.so庫時,retur()方法不起作用。爲什麼?我沒有錯誤,但它應該打印「測試」,它不會; t。需要一些help.THXphp擴展方法未返回爲什麼?

[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 

這裏是個[example.cc]

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

我想提一提的是汽車類和它的方法都在工作。

+0

你確定PHP使用它的類和方法加載擴展嗎?通過說「class car並且它的方法正在工作」,你是指C++類還是它的PHP對應類? –

+0

我不確定PHP對應的工作。 – sunset

+0

是第二個C++類的第二個處理程序是否正確?請幫助 – sunset

回答

0

如果您的retur方法確實在寫入stdout,那麼您應該注意到,PHP的輸出通常與com stdout不一致。

對於CLI SAPI(例如),它可以,但即使如此,通過直接寫入標準輸出,您將繞過PHP的輸出緩衝。

您必須改用php_printfPHPWRITE

+0

我的php .cc文件中有一些錯誤嗎? – sunset