天天看點

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;