2011-09-26 82 views
0

我正在研究C++類的php擴展。如何創建一個鏈接到一個方法,該方法接受一個類的對象作爲參數?如何爲一個對象創建一個php擴展?

你能舉幾個例子嗎? THX。欣賞!

我成功創建了一個鏈接到一個方法,該方法接受一個字符串或int作爲參數。但我不知道如何做到這一點的方法。

下面是一個簡單的例子:

PHP_METHOD(Class1, method_string) 
{ 
    Class1 *access; 
    char *strr=NULL; 

    int strr_len; 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &strr, &strr_len) == FAILURE) { 
     RETURN_NULL(); 
    } 
    access_object *obj = (access_object *)zend_object_store_get_object(
     getThis() TSRMLS_CC); 
    access = obj->access; 
    if (access != NULL) { 
     std::string s(strr); 
     RETURN_BOOL(access->method_string(s)); 
    } 

} 

回答

0

我相信ZEND_API詮釋zend_parse_method_parameters(INT num_args TSRMLS_DC,zval的* this_ptr,字符* type_spec,...); AND ZEND_API int zend_parse_method_parameters_ex(int flags,int num_args TSRMLS_DC,zval * this_ptr,char * type_spec,...);是用於檢索方法中的輸入參數的正確API。

我認爲相同的API將幫助您接受一個對象作爲輸入參數。

-Gaurav

0

使用Zend API zend_parse_method_parameters()

ZEND_METHOD(ext_access_class, do_something) 
{ 
    zval* objid_this = NULL, objid1 = NULL; 

    // note: ext_access_class_entry and ext_param_class_entry are of type zend_class_entry* 
    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "OO", &objid_this, ext_access_class_entry, &objid1, ext_param_class_entry) == FAILURE) 
     RETURN_NULL(); 


    ext_access_class* const access_obj = (ext_access_class*) zend_object_store_get_object(objid_this TSRMLS_CC); 
    Class1* const access = access_obj->access; 

    ext_param_class* const param_obj = (ext_param_class*) zend_object_store_get_object(objid1 TSRMLS_CC); 
    Class2* const myobject = param_obj->myobject; 


    const bool ret = access->do_something(myobject); 

    RETURN_BOOL(ret); 
}