ZVAL_STRING 和 ZVAL_STRINGL

原创 2016年08月30日 21:44:25

字符串处理是我们常用的操作,而 zend 封装了很多关于字符串操作相关的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL

#define ZVAL_STRING(z, s, duplicate) do {	\
		const char *__s=(s);				\
		zval *__z = (z);					\
		Z_STRLEN_P(__z) = strlen(__s);		\
		Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(char*)__s);\
		Z_TYPE_P(__z) = IS_STRING;			\
	} while (0)

#define ZVAL_STRINGL(z, s, l, duplicate) do {	\
		const char *__s=(s); int __l=l;			\
		zval *__z = (z);						\
		Z_STRLEN_P(__z) = __l;					\
		Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(char*)__s);\
		Z_TYPE_P(__z) = IS_STRING;				\
	} while (0)

因为 php 内部很多字符串操作(例如 substr)最后都是给予这样的宏来操作的,所以在这里了解这两个宏非常重要。

ZVAL_STRINGL 在处理的时候,因为给了 length 参数,所以不需要在使用 strlen 来求字符串的长度了, 性能上有所提升。

关于 estrndup 也都是封装了一层的,在 php 扩展开发的时候,尽量使用系统封装的函数,这样可以优化内存,降低内存泄漏等风险

ZEND_API char *_estrndup(const char *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
	char *p;
#ifdef ZEND_SIGNALS
	TSRMLS_FETCH();
#endif

	HANDLE_BLOCK_INTERRUPTIONS();

	p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
	if (UNEXPECTED(p == NULL)) {
		HANDLE_UNBLOCK_INTERRUPTIONS();
		return p;
	}
	memcpy(p, s, length);
	p[length] = 0;
	HANDLE_UNBLOCK_INTERRUPTIONS();
	return p;
}

有几个 e* 开发的函数 具体参看




版权声明:本文为博主原创文章,未经博主允许不得转载。

php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL

字符串处理是我们常用的操作,而 zend 封装了很多关于字符串操作相关的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL...
  • treesky
  • treesky
  • 2015年06月15日 21:33
  • 2592

php7-internal 7.7 zval的操作

扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己去管理这些值将是非常繁...
  • gb4215287
  • gb4215287
  • 2017年09月29日 15:37
  • 239

【原创】PHP扩展开发进阶

本文是介绍初步PHP工作机制之上,介绍PHP内核中变量的实现.在此基础上,才能将需要的功能,使用zend api在PHP扩展中实现...
  • heiyeshuwu
  • heiyeshuwu
  • 2015年03月15日 00:19
  • 5834

PHP扩展编写第二步:参数,数组,以及ZVAL

原文地址:http://weizhifeng.net/write-php-extension-part2-1.html 介绍 在这个系列教程的第一部分,你已经了解了一个PH...
  • xiaogugood
  • xiaogugood
  • 2014年06月30日 14:12
  • 2800

$()和${}和$(())和(())

Shell学习笔记 - $()和${}和$(())和(()) $()和${}的用法: 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command su...
  • chenyiming_1990
  • chenyiming_1990
  • 2013年08月26日 11:53
  • 832

linux $()和${}和$(())和(())

$()和${}的用法: 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(commandsubstitution)的。而 $( ) 并不见的每一种 shell 都...
  • leehbing
  • leehbing
  • 2017年03月12日 21:03
  • 104

&和&& |和||

按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;(都会运行) 逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true;只要有一个为false后面就不执行了 例...
  • cheidou123
  • cheidou123
  • 2017年04月04日 13:35
  • 57

${}和#{}的区别

mybatis中${}和#{}区别
  • zouxucong
  • zouxucong
  • 2016年10月17日 11:53
  • 13355

|和|| &和&&

|和|| &和&&的区别
  • Mr_zhuo_
  • Mr_zhuo_
  • 2017年03月30日 17:37
  • 180

&&和& ;||和|

&&短路与 &与(非短路与) ||短路或 |或(非短路或) 关于它们的用法可以百度,这里介绍它们的区别: 就拿“与”来说,要求所有的条件都判断;而如果使用短路与,第一个条件为...
  • SAYA_
  • SAYA_
  • 2015年10月25日 16:33
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZVAL_STRING 和 ZVAL_STRINGL
举报原因:
原因补充:

(最多只允许输入30个字)