天天看点

zend_parse_method_parameters 和 zend_parse_parameters 区别

zend_parse_method_parameters 必须第一个格式字符串是 O

this_ptr作为返回值 返回(赋值给obj_ptr) 且必须是 mchessian_service_ce_ptr类型实例 

if (FAILURE == zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, p_this, "O|o", &obj_ptr, mcphessian_service_ce_ptr, &obj2_ptr)) {

zend_error(E_WARNING, "parse parameters error.");

//return;

}

 ZEND_API int zend_parse_method_parameters(int num_args TSRMLS_DC, zval *this_ptr, const char *type_spec, ...)

{

va_list va;

int retval;

const char *p = type_spec;

zval **object;

zend_class_entry *ce;

if (!this_ptr) {

RETURN_IF_ZERO_ARGS(num_args, p, 0);

va_start(va, type_spec);

retval = zend_parse_va_args(num_args, type_spec, &va, 0 TSRMLS_CC);

va_end(va);

} else {

p++;

RETURN_IF_ZERO_ARGS(num_args, p, 0);

va_start(va, type_spec);

object = va_arg(va, zval **);

ce = va_arg(va, zend_class_entry *);

*object = this_ptr;

if (ce && !instanceof_function(Z_OBJCE_P(this_ptr), ce TSRMLS_CC)) {

zend_error(E_CORE_ERROR, "%s::%s() must be derived from %s::%s",

ce->name, get_active_function_name(TSRMLS_C), Z_OBJCE_P(this_ptr)->name, get_active_function_name(TSRMLS_C));

}

retval = zend_parse_va_args(num_args, p, &va, 0 TSRMLS_CC);

va_end(va);

}

return retval;