c-zend_read_property函数中的rv参数是什么



我正在使用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的地址,在这种情况下,如果存在与之相关的动态内存结构(例如字符串或对象值(,您应该释放rvzval。

以下是来自www.phpinternalsbok.com 的简介

read_property可以直接返回对象拥有的zval,在这种情况下,其引用计数不应被read_property修改,调用方不应释放它。或者,它可以为临时zval返回rv(例如,对__get的调用结果(,在这种情况下,refcount应该增加,调用方负责释放值。

我查看了php-src中的一些代码,发现许多调用zend_read_property的实例并没有像我预期的那样检查/释放zv值。如果程序员知道它永远不会被有问题的处理程序使用,那么它可能是一个优化。

我也不清楚调用者是否负责初始化rv。我倾向于不这么认为:如果处理程序决定使用rv,它将确保它被初始化并返回其地址。然后,在一般情况下,调用者应该检查返回值是否等于rv,并相应地释放它。

最新更新