PHP扩展编写第二部分:参数、数组与ZVAL

需积分: 9 1 下载量 153 浏览量 更新于2024-08-01 收藏 138KB DOC 举报
"这篇教程是Extension Writing系列的第二部分,主要关注PHP扩展中的参数、数组以及ZVALs的处理。作者Sara G在文中详细介绍了如何接受来自脚本的值,ZVAL的数据结构,如何创建ZVAL,以及PHP和Zend引擎如何内部管理变量。" 在PHP扩展开发中,参数处理与用户空间的代码处理方式不同。函数的参数并不直接在函数头声明,而是通过函数体内部获取到参数列表的引用。无论是否传入参数,每个函数都能请求Zend引擎将它们转化为可用的值。例如,我们可以创建一个名为hello_greetme()的新函数,该函数接受一个参数并将其与问候语一起输出。 **接受值** 在PHP扩展中,你可以通过遍历参数列表来获取传递的值。在C语言中,这通常涉及到使用 Zend Engine 提供的API,如`zend_parse_parameters`函数。这个函数允许你指定参数类型(例如,字符串、整型、数组等),然后解析脚本传递的实际参数。 **ZVAL** ZVAL是PHP内部表示变量的核心数据结构。它包含变量的类型、值以及两个重要的属性:refcount(引用计数)和is_ref(是否为引用)。ZVAL用于存储所有类型的PHP变量,包括基本类型和复杂类型如数组。 **创建ZVALs** 在扩展中,你需要手动创建ZVAL来存储动态生成的值。使用`ZVAL_*`宏(如ZVAL_STRING、ZVAL_LONG等)可以初始化一个新的ZVAL,并分配相应的内存。同时,需要确保在不再需要时正确释放这些内存。 **数组** 在PHP中,数组是一种特殊的数据结构,可以存储不同类型的数据。在扩展中处理数组时,需要理解如何通过ZVALs和符号表(symbol table)来操作。符号表实际上是一个哈希表,用于存储变量名和对应的ZVAL指针。通过遍历符号表,你可以访问数组的所有元素。 **引用计数和复制** PHP的内存管理依赖于引用计数。当一个ZVAL被创建或赋值时,其refcount增加。当ZVAL不再被使用时,如果refcount降为0,那么ZVAL会被自动清理。复制ZVAL(如通过赋值操作)会创建一个新的ZVAL副本,但原始ZVAL和副本的refcount都会增加。这样,当任一副本不再使用时,只有它的refcount会减少。 **拷贝与引用** 在PHP中,赋值操作可能产生的是拷贝还是引用,取决于上下文。在扩展中,你必须明确指定何时创建拷贝,何时创建引用。理解这一点对于正确处理变量的生命周期至关重要。 **符号表作为数组** 符号表可以被视为一个特殊的数组,其中的键是变量名,值是对应的ZVAL。这使得在扩展中查找、修改和删除变量变得简单。 **总结** 本教程的这部分深入探讨了PHP扩展中处理参数、数组和ZVALs的关键概念,这对于理解PHP和Zend引擎的内部工作原理非常重要。通过学习这些内容,开发者可以更好地构建高效且稳定的PHP扩展,有效地处理用户传递的值和内部的变量管理。接下来的内容可能涉及更复杂的主题,如优化内存使用、处理复杂数据结构以及异常处理等。