2012-07-13 5 views
13

मैंने php एक्सटेंशन में C++ क्लास को लपेटने के लिए 4 फाइलें बनाई हैं.अब मैं लपेटने के लिए कोड चलाने के लिए चाहता हूं। लेकिन मुझे इसके बारे में कोई जानकारी नहीं है। मैं कोड कैसे चला सकता हूं? vehicles.ccमैं php एक्सटेंशन में C++ क्लास को कैसे लपेट सकता हूं?

#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 */ 

:

मैं ट्यूटोरियल अनुसरण कर रहा हूँ http://devzone.zend.com/article/4486 पर, और यहाँ मैं अब तक है ग्राफ़ कोड है 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

आप कहां फंस गए हैं, 'phpize'? – Leigh

+0

मैं रैपिंग के लिए कोड कैसे चला सकता हूं? – user1422892

+0

मैंने एक मॉड्यूल बनाया..इस php -d "एक्सटेंशन = veh.so" -m टिप्पणी का उपयोग करना। लेकिन मुझे लपेटने के बारे में कोई जानकारी नहीं है .. मैं लपेटने के लिए कोड कैसे चला सकता हूं? – user1422892

उत्तर

1
  1. सुनिश्चित करें कि मॉड्यूल PHP में सही ढंग से भरी हुई है। आप इसे कमांड लाइन पर देख सकते हैं। आपके एक्सटेंशन $ php -i के अनुरूप एक प्रविष्टि होनी चाहिए। ग्रेप वाहनों

  2. पीएचपी में, आप निम्न कार्य

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

अधिक जानकारी के लिए यहाँ देखें कर सकते हैं: http://devzone.zend.com/303/extension-writing-part-i-introduction-to-php-and-zend/

0

आप पहले मॉड्यूल संकलित करने के लिए करना चाहिए। अगले आदेशों का प्रयास करें:

phpize && configure && make 

आपके साथ निर्देशिका में स्रोत कोड संकलित तथा-मॉड्यूल वाहनों को प्रदर्शित करता है। "मॉड्यूल =/पथ/से/वाहन.सो" सामग्री के साथ संबंधित ini-file बनाकर उस मॉड्यूल को php में जोड़ें और उन्हें php.ini में शामिल करें।

php -m | grep vehicles 

यदि आप मॉड्यूल नाम देखते हैं तो आप PHP कोड में बनाई गई कक्षा का उपयोग करने का प्रयास करें।

संबंधित मुद्दे