2012-07-13 12 views
13

Stworzyłem 4 pliki do zawinięcia klasy C++ w rozszerzeniu PHP. Teraz chcę uruchomić kod do zawijania. Ale nie mam o tym pojęcia. Jak mogę uruchomić kod?Jak mogę opakować klasę C++ w rozszerzenie php?

Obserwuję tutorial na co http://devzone.zend.com/article/4486, a oto kod Graph mam tak daleko: 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

Gdzie dokładnie utknąłeś, 'phpize'? – Leigh

+0

Jak mogę uruchomić kod do zawijania? – user1422892

+0

Stworzyłem Module..using tego php -d "extension = vehicles.so" -m komentarz.Ale nie mam pojęcia o zawijaniu .. Jak mogę uruchomić kod do pakowania? – user1422892

Odpowiedz

0

należy najpierw skompilować moduł. Wypróbuj następne polecenia:

phpize && configure && make 

W katalogu, w którym znajduje się kod źródłowy, pojawiają się skompilowane pojazdy. Dodaj ten moduł do ciebie, tworząc odpowiedni plik ini z zawartością "extension =/path/to/vehicles.so" i dołącz do php.ini. Następnie spróbuj

php -m | grep vehicles 

Jeśli widzisz nazwę modułu, spróbuj użyć stworzonej klasy w swoim php.

Powiązane problemy