【问题标题】:What is the rv parameter in the zend_read_property functionzend_read_property函数中的rv参数是什么
【发布时间】:2022-11-11 15:08:16
【问题描述】:

我正在使用 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 变量名称是“返回值”的缩写,如果这是您所要求的。
  • @TaimoorZaeem,不,不是。 zval *output, rv; output = zend_read_property(ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("output"), ZEND_FETCH_CLASS_SILENT, &rv); *output 是返回值。不确定房车。

标签: c php-extension zend-api


【解决方案1】:

rv 参数是为类的 read_property 处理程序提供一个存储属性值(即返回值)的位置的简单方法。实现可能不容易将属性值存储为zval,在这种情况下,它可以使用rv 参数并让调用者担心zval 的生命周期。您可以将其视为财产价值居住的临时位置。

重要的是要注意 read_property 处理程序不必使用 rv 参数。理想情况下,您应该检查返回值是否等于rv 的地址,在这种情况下,您应该释放rv zval,以防有与之关联的动态内存结构(例如字符串或对象值)。

这是来自www.phpinternalsbook.com 的简介

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 2014-11-04
    • 2018-10-20
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2014-08-18
    相关资源
    最近更新 更多