我正在使用zend_read_property从对象中读取属性。
zend_read_property(
scope: *mut zend_class_entry,
object: *mut zval,
name: *const c_char,
name_length: size_t,
silent: zend_bool,
rv: *mut zval
) -> *mut zval
zval *output, rv;
output = zend_read_property(ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("output"), ZEND_FETCH_CLASS_SILENT, &rv);
但是,我不知道为什么它需要rv参数。此参数的用途是什么?
rv
参数是为类的read_property
处理程序提供一个存储属性值(即返回值(的位置的简单方法。实现可能不容易将属性值存储为zval
,在这种情况下,它可以使用rv
参数,并让调用方担心zval
的生命周期。你可以把它想象成一个房产价值居住的临时地点。
需要注意的是,read_property
处理程序不必使用rv
参数。理想情况下,您应该检查返回值是否等于rv
的地址,在这种情况下,如果存在与之相关的动态内存结构(例如字符串或对象值(,您应该释放rv
zval。
以下是来自www.phpinternalsbok.com 的简介
read_property可以直接返回对象拥有的zval,在这种情况下,其引用计数不应被read_property修改,调用方不应释放它。或者,它可以为临时zval返回rv(例如,对__get的调用结果(,在这种情况下,refcount应该增加,调用方负责释放值。
我查看了php-src
中的一些代码,发现许多调用zend_read_property
的实例并没有像我预期的那样检查/释放zv
值。如果程序员知道它永远不会被有问题的处理程序使用,那么它可能是一个优化。
我也不清楚调用者是否负责初始化rv
。我倾向于不这么认为:如果处理程序决定使用rv
,它将确保它被初始化并返回其地址。然后,在一般情况下,调用者应该检查返回值是否等于rv
,并相应地释放它。