如何为一个对象创建一个php扩展?
问题描述:
我正在研究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));
}
}
答
我相信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
答
使用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);
}