PHP7/5扩展开发函数手册(2) - zval操作

本文详细介绍了在PHP扩展开发中zval的操作,包括zval的创建、销毁、类型获取、引用计数管理以及常量的注册等关键知识点,帮助开发者深入理解PHP内部机制。
摘要由CSDN通过智能技术生成

目录

  • String 的两个宏定义
  • 在扩展中打印zval
  • zval 的销毁
  • zval 类型获取
  • 获取 zval 的 value 值
  • zval变量赋值
  • 获取zval引用计数
  • 增加引用计数?
  • 传入参数分离
  • 获取常量的值
  • 注册常量

String 的两个宏定义

在Zend 内核中,针对字符串,定义了两个宏, 这个在后续的字符串处理中经常需要用到,大家留意

----zend_portability.h----
#define ZEND_STRL(str)		(str), (sizeof(str)-1)
#define ZEND_STRS(str)		(str), (sizeof(str))

 

在扩展中打印 zval

我们在写扩展过程中,可以用 php_debug_zval_dump 打印 zval, 以便于调试,该函数会打印出引用计数 ref_count

zval *matches;

SW_ALLOC_INIT_ZVAL(matches);
SW_ZVAL_STRING(matches, "/([a-zA-Z0-9_\\-]*)\\s*\\(([a-zA-Z0-9_\\-]*)\\)/i", 1);
php_debug_zval_dump(matches, 1);

zval 的创建

MAKE_STD_ZVAL(pzv). 这个宏将会以一种优化的方式为zval分配空间, 自动的处理超出内存错误,并初始化新zval的refcount和is_ref属性,除此之外,还有宏 ALLOC_INIT_ZVAL(). 这个宏和MAKE_STD_ZVAL唯一的区别是它会将zval *的数据类型初始化为IS_NULL。

MAKE_STD_ZVAL例子(注意:在PHP7下,已经不允许我们在堆上去分配 zval 空间,我们通常的做法是, 定义一个临时变量(栈上),然后将 p 的指针指向这个临时变量的地址,注意在使用完之后销毁zval,通常,我们可以在.h文件中做一个php5和php7版本的适配, 让你的代码能同时在php5 和 php7 上编译通过):

----php7_wrapper.h----
#if PHP_MAJOR_VERSION < 7 /* PHP Version 5*/
	#define SW_MAKE_STD_ZVAL(p)               MAKE_STD_ZVAL(p)
	#define SW_ALLOC_INIT_ZVAL(p)             ALLOC_INIT_ZVAL(p)
	#define sw_zval_ptr_dtor(p)	          zval_ptr_dtor(*p) //zval销毁

#else /* PHP Version 7 */
        //栈上分配空间
	#define SW_MAKE_STD_ZVAL(p)             zval _stack_zval_##p; p = &(_stack_zval_##p)
	#define SW_ALLOC_INIT_ZVAL(p)           do{p = (zval *)emalloc(sizeof(zval)); bzero(p, sizeof(zval));}while(0)
	#define sw_zval_ptr_dtor(p)	        zval_ptr_dtor(*p) //zval销毁

#endif

----swoole_server.c----

static PHP_METHOD(swoole_http_client, __construct)
{
	...
	
    //SW_MAKE_STD_ZVAL分配的zval内存必须在使用后手动释放
    zval *headers;
    SW_MAKE_STD_ZVAL(headers);
    array_init(headers); //初始化为数组
    zend_update_property(swoole_http_client_class_entry_ptr, getThis(), ZEND_STRL("headers"), headers TSRMLS_CC);
    sw_zval_ptr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值