static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zval *arg, ulong fetch_type TSRMLS_DC) |
{ |
... //省略 |
|
if (cur_arg_info->class_name) { |
const char *class_name; |
|
if (!arg) { |
need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); |
return zend_verify_arg_error(zf, arg_num, cur_arg_info, need_msg, class_name, "none" , "" TSRMLS_CC); |
} |
if (Z_TYPE_P(arg) == IS_OBJECT ) { // 既然是类对象参数, 传递的参数需要是对象类型 |
// 下面检查这个对象是否是参数提示类的实例对象, 这里是允许传递子类实力对象 |
need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); |
if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC)) { |
return zend_verify_arg_error(zf, arg_num, cur_arg_info, need_msg, class_name, "instance of " , Z_OBJCE_P(arg)->name TSRMLS_CC); |
} |
} else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) { // 参数为NULL, 也是可以通过检查的, |
// 如果函数定义了参数默认值, 不传递参数调用也是可以通过检查的 |
need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); |
return zend_verify_arg_error(zf, arg_num, cur_arg_info, need_msg, class_name, zend_zval_type_name(arg), "" TSRMLS_CC); |
} |
} else if (cur_arg_info->array_type_hint) { // 数组 |
if (!arg) { |
return zend_verify_arg_error(zf, arg_num, cur_arg_info, "be an array" , "" , "none" , "" TSRMLS_CC); |
} |
if (Z_TYPE_P(arg) != IS_ARRAY && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) { |
return zend_verify_arg_error(zf, arg_num, cur_arg_info, "be an array" , "" , zend_zval_type_name(arg), "" TSRMLS_CC); |
} |
} |
return 1; |
} |