Как создать расширение PHP для объекта? - PullRequest
0 голосов
/ 26 сентября 2011

Я работаю над расширением php для классов C ++. Как создать ссылку на метод, который принимает в качестве параметра объект класса?

Можете привести примеры? СПАСИБО. ОЦЕНИВАЕМ!

Мне удалось создать ссылку на метод, который принимает в качестве параметра строку или 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));
    }

}

Ответы [ 2 ]

0 голосов
/ 26 октября 2013

Используйте 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);
}
0 голосов
/ 21 октября 2011

Я полагаю, ZEND_API int zend_parse_method_parameters (int num_args TSRMLS_DC, zval * this_ptr, char * type_spec, ...); А ТАКЖЕ ZEND_API int zend_parse_method_parameters_ex (int flags, int num_args TSRMLS_DC, zval * this_ptr, char * type_spec, ...); правильный API для получения входных параметров в методе.

Я думаю, что тот же API поможет вам принять объект в качестве входного параметра.

-Gaurav

...