PHP8通过ZPP宏获取zend_class_entry

本文基于的commit为:e93d20ad7ebc1075ef1248a663935ee5ea69f1cd

昨天(2020-6-30),有一个宏被加入到了PHP8里面,用来快速获取一个类名字或者对象的zend_class_entry结构,在PHP7里面,如果我们要去获取类,我们必须得这么做:

1
2
3
4
5
6
7
8
9
10
11
zval *arg;
zend_class_entry *ce = NULL;

zend_parse_parameters(ZEND_NUM_ARGS(), "z", &arg)

if (Z_TYPE_P(arg) == IS_OBJECT) {
ce = Z_OBJ_P(arg)->ce;
} else if (Z_TYPE_P(arg) == IS_STRING) {
ce = zend_lookup_class(Z_STR_P(arg));
}
RETURN_STR_COPY(ce->name);

现在,有了Z_PARAM_CLASS_NAME_OR_OBJ宏,我们可以非常方便的去实现这个操作:

1
2
3
4
5
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_CLASS_NAME_OR_OBJ(ce)
ZEND_PARSE_PARAMETERS_END();

RETURN_STR_COPY(ce->name);