2011-09-13 4 views
0

다음은 php_ex.cc입니다. .so 라이브러리를 컴파일 할 때 retur() 메소드가 작동하지 않습니다. 왜? 나는 오류가 없지만 "test"를 인쇄해야하고 그렇지 않다. t. 내가 그 클래스의 자동차를 언급하고 싶습니다이 방법은 작업의PHP 확장 메서드가 반환되지 않습니다 이유는 무엇입니까?

가 [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 

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

[example.cc] 번째 일부 help.THX이 필요합니다.

+0

PHP가 클래스와 메소드로 확장을로드 했습니까? "클래스 자동차와 그것의 메소드가 작동 중입니다"라고 말하면 C++ 클래스 또는 PHP 클래스를 의미합니까? –

+0

나는 PHP가 작동하는지 모르겠습니다. – sunset

+0

두 번째 C++ 클래스의 두 번째 처리기가 맞습니까? 제발 도울 – sunset

답변

0

retur 메서드가 실제로 stdout에 쓰는 경우 일반적으로 PHP의 출력은 stdout과 일치하지 않습니다.

CLI SAPI의 경우 (예를 들어), PHP의 출력 버퍼링을 거치지 않고 stdout에 직접 쓰면됩니다.

대신 php_printf 또는 PHPWRITE을 사용해야합니다.

+0

내 PHP는. cc 파일에 somethng 잘못입니까? – sunset

관련 문제