2012-07-13 14 views
13

Tôi đã tạo 4 tệp để bọc một lớp C++ trong phần mở rộng php. Bây giờ tôi muốn chạy mã cho gói.But tôi không biết gì về điều đó. Làm cách nào để tôi có thể chạy mã?Làm thế nào tôi có thể bọc một lớp C++ trong phần mở rộng php?

Tôi đang theo hướng dẫn qua tại http://devzone.zend.com/article/4486, và đây là mã Graph tôi có cho đến nay: vehicles.cc

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

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); 

    efree(obj); 
} 

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; 
} 


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; 
    car_object *obj = (car_object *)zend_object_store_get_object(
     getThis() TSRMLS_CC); 
    car = obj->car; 
    if (car != NULL) { 
     car->accelerate(); 
    } 
} 
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) 
{ 
} 


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),  /* 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 

php_vehicles.h

#ifndef PHP_VEHICLES_H 
#define PHP_VEHICLES_H 

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

#ifdef HAVE_CONFIG_H 
#include "config.h" 
#endif 

extern "C" { 
#include "php.h" 
} 

extern zend_module_entry vehicles_module_entry; 
#define phpext_vehicles_ptr &vehicles_module_entry; 

#endif /* PHP_VEHICLES_H */ 

config.m4

PHP_ARG_ENABLE(vehicles, 
    [Whether to enable the "vehicles" extension], 
    [ --enable-vehicles  Enable "vehicles" extension support]) 

if test $PHP_VEHICLES != "no"; then 
    PHP_REQUIRE_CXX() 
    PHP_SUBST(VEHICLES_SHARED_LIBADD) 
    PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD) 
    PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared) 
fi 

car.h

#ifndef VEHICLES_CAR_H 
#define VEHICLES_CAR_H 

// A very simple car class 
class Car { 
public: 
    Car(int maxGear); 
    void shift(int gear); 
    void accelerate(); 
    void brake(); 
    int getCurrentSpeed(); 
    int getCurrentGear(); 
private: 
    int maxGear; 
    int currentGear; 
    int speed; 
}; 

#endif /* VEHICLES_CAR_H */ 

car.cc

#include "car.h" 

Car::Car(int maxGear) { 
    this->maxGear = maxGear; 
    this->currentGear = 1; 
    this->speed = 0; 
} 

void Car::shift(int gear) { 
    if (gear < 1 || gear > maxGear) { 
     return; 
    } 
    currentGear = gear; 
} 

void Car::accelerate() { 
    speed += (5 * this->getCurrentGear()); 
} 

void Car::brake() { 
    speed -= (5 * this->getCurrentGear()); 
} 

int Car::getCurrentSpeed() { 
    return speed; 
} 

int Car::getCurrentGear() { 
    return currentGear; 
} 
+0

Bạn bị kẹt ở đâu, 'phpize'? – Leigh

+0

Tôi làm cách nào để chạy mã để gói? – user1422892

+0

Tôi tạo ra một Module..using php-mở rộng = "vehicles.so" -m bình luận.Nhưng tôi không có ý tưởng về gói .. Làm thế nào tôi có thể chạy mã cho gói? – user1422892

Trả lời

1
  1. Đảm bảo rằng các mô-đun được nạp một cách chính xác trong PHP. Bạn có thể kiểm tra điều này trên dòng lệnh. Nên có mục nhập tương ứng với tiện ích mở rộng của bạn $ php -i | xe grep

  2. Trong PHP, bạn có thể làm như sau

    <?php $oCar = new Car(); $oCar->shift(1); ?>

Xem ở đây để biết thêm: http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/

0

Bạn nên đầu tiên để biên dịch module. Hãy thử các lệnh tiếp theo:

phpize && configure && make 

Vào thư mục với mã nguồn của bạn xuất hiện được biên dịch các loại mô-đun như vậy. Thêm mô-đun đó cho bạn php bằng cách tạo tập tin ini tương ứng với nội dung "extension =/path/to/vehicles.so" và đưa chúng vào php.ini. Than thử

php -m | grep vehicles 

Nếu bạn thấy tên mô-đun, hãy thử sử dụng lớp được tạo trong mã php của bạn.