PHP扩展C开发中zval格式对象实例获取及long类型属性更新咨询
问题原因
你使用的是PHP 8.0及更高版本,Zend API存在版本不兼容变更:zend_update_property_long()、zend_update_property()等属性更新函数的第二个入参要求,从PHP7系列的zval *改为了zend_object *类型,而getThis()宏返回的始终是当前对象的zval *指针,因此出现类型不匹配的编译错误。
解决方案
直接使用Zend内置的Z_OBJ_P()宏,即可从zval *指针中提取对应的zend_object *实例,修改你代码中两处属性更新的调用即可:
// 更新lastError属性 zend_update_property_long(kaya_class_entry, Z_OBJ_P(getThis()), "lastError", sizeof("lastError") - 1, error); // 更新resource属性 zend_update_property(kaya_class_entry, Z_OBJ_P(getThis()), "resource", sizeof("resource") - 1, &kaya_ptr TSRMLS_CC);
跨版本兼容方案(可选)
如果你的扩展需要同时兼容PHP7和PHP8版本,可以通过版本判断宏统一封装调用逻辑:
// 放在扩展头文件公共位置 #if PHP_VERSION_ID >= 80000 #define GET_THIS_OBJECT() Z_OBJ_P(getThis()) #else #define GET_THIS_OBJECT() getThis() #endif // 业务代码中直接调用 zend_update_property_long(kaya_class_entry, GET_THIS_OBJECT(), "lastError", sizeof("lastError") - 1, error);
内容的提问来源于stack exchange,提问作者Sileno Brito
相关产品推荐
相关产品推荐

