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核心函数xdebug_debug_zval

引用计数基本知识 ¶ 每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个...
  • Ethan19
  • Ethan19
  • 2015年10月19日 17:56
  • 1093

PHP扩展开发(7):zval结构

转载自:http://terrylee.me/blog/post/2011/02/12/php-extension-part1.aspx 在前面的文章多次提到了zval结构,其实所有用户定义的变量在P...

PHP内核探索之变量(1)变量的容器-Zval

作为数据的容器,我们常常需要跟变量打交道,不管这个变量是数字、数组、字符串、对象还是其他,因而可以说变量是构成语言的不可或缺的基础。本文是PHP内核探索之变量的第一篇,主要介绍zval的基本知识,包括...

深入理解PHP7之zval

PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 今天我想先和大家聊聊zval的变化. 在讲zval变化的之前我们先来看看zval在PHP5下面是什么样子。PHP5zval回顾在PHP5...

PHP内核原理(三)zval类型转换和操作

PHP内核原理 Zvals类型转换及操作基本操作由于zvals是一个复杂的结构体,所以你不能直接对其进行操作如:zv1 + zv2。即使最为简单的操作如+对于zvals来说也是极为复杂的,因为你必须适...

PHP5和7中的zval全介绍,内存管理,类型,引用计数(2)

转自:http://0x1.im/blog/php/Internal-value-representation-in-PHP-7-part-2.html 本文第一部分和第二均翻译自Nikita ...

PHP5和7中的zval全介绍,内存管理,类型,引用计数(1)

转自:http://0x1.im/blog/php/Internal-value-representation-in-PHP-7-part-1.html 本文第一部分和第二均翻译自Nikita Po...

PHP内核探索之变量(1)Zval

作为数据的容器,我们常常需要跟变量打交道,不管这个变量是数字、数组、字符串、对象还是其他,因而可以说变量是构成语言的不可或缺的基础。本文是PHP内核探索之变量的第一篇,主要介绍zval的基本知识,包括...
  • fvjuerh
  • fvjuerh
  • 2017年04月01日 16:57
  • 54

探索PHP内核中变量的容器-Zval

目录(?)[-] 一Zval的基本结构二xdebug的安装配置Zval的更多原理使用unset时对减少相应zval的refcount值数组变量与普通变量生成的zval非常类似但也有很大不同引用的...

深入理解PHP7zval

深入理解PHP7之zval 时间 2015-12-12 21:12:56  极客头条 原文  https://github.com/laruence/php7-internal/blob/ma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZVAL_STRING 和 ZVAL_STRINGL
举报原因:
原因补充:

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