热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP扩展开发中的常用宏总结与解析(持续更新)

在PHP扩展开发中,常用宏的合理运用能够显著提升代码的可读性和效率。本文总结并解析了多个关键宏,如`ZEND_STRL`用于字符串长度计算,`TSRMLS_D`用于线程安全资源管理,以及`TSRMLS_DC`用于函数参数传递。通过详细解释这些宏的功能和使用场景,帮助开发者更好地理解和应用它们,提高开发效率和代码质量。

#define ZEND_STRL(str) (str), (sizeof(str)-1)

#define TSRMLS_D void ***tsrm_ls

#define TSRMLS_DC , void ***tsrm_ls // 定义

#define TSRMLS_C tsrm_ls

#define TSRMLS_CC , tsrm_ls // 调用

// 定义常量

zend_declare_class_constant_*

// 增加数组索引和值

add_assoc_*

add_index_*

// 定义并初始化数组

zval *levels;

MAKE_STD_ZVAL(levels); // ALLOC_INIT_ZVAL 它会将所指的zval的类型设置为IS_NULL;

array_init(levels);

// 定义方法

PHP_METHOD // ZEND_METHOD

PHP_ME // ZEND_ME

// 初始化类

INIT_CLASS_ENTRY(ce, name, methods)

zend_register_internal_class // 注册类

zend_register_internal_class_ex

zend_class_entry

zend_function_entry

// 操作zval

ZVAL_NULL

ZVAL_BOOL

ZVAL_LONG

ZVAL_STRINGL

ZVAL_*

// 类型转换

convert_to_long

convert_to_*

// 设置符号表

ZEND_SET_SYMBOL

// 释放变量内存

FREE_ZVAL

FREE_ZVAL_REL

FREE_ZVAL_EX

FREE_ZVAL_REL_EX

// 申请内存

ALLOC_ZVAL_REL

ALLOC_ZVAL

ALLOC_PERMANENT_ZVAL

// 操作整数的

#define Z_LVAL(zval) (zval).value.lval

#define Z_LVAL_P(zval_p) Z_LVAL(*zval_p)

#define Z_LVAL_PP(zval_pp) Z_LVAL(**zval_pp)

// 操作IS_BOOL布尔型的

#define Z_BVAL(zval) ((zend_bool)(zval).value.lval)

#define Z_BVAL_P(zval_p) Z_BVAL(*zval_p)

#define Z_BVAL_PP(zval_pp) Z_BVAL(**zval_pp)

// 操作浮点数的

#define Z_DVAL(zval) (zval).value.dval

#define Z_DVAL_P(zval_p) Z_DVAL(*zval_p)

#define Z_DVAL_PP(zval_pp) Z_DVAL(**zval_pp)

// 操作字符串的值和长度的

#define Z_STRVAL(zval) (zval).value.str.val

#define Z_STRVAL_P(zval_p) Z_STRVAL(*zval_p)

#define Z_STRVAL_PP(zval_pp) Z_STRVAL(**zval_pp)

#define Z_STRLEN(zval) (zval).value.str.len

#define Z_STRLEN_P(zval_p) Z_STRLEN(*zval_p)

#define Z_STRLEN_PP(zval_pp) Z_STRLEN(**zval_pp)

#define Z_ARRVAL(zval) (zval).value.ht

#define Z_ARRVAL_P(zval_p) Z_ARRVAL(*zval_p)

#define Z_ARRVAL_PP(zval_pp) Z_ARRVAL(**zval_pp)

// 操作对象的

#define Z_OBJVAL(zval) (zval).value.obj

#define Z_OBJVAL_P(zval_p) Z_OBJVAL(*zval_p)

#define Z_OBJVAL_PP(zval_pp) Z_OBJVAL(**zval_pp)

#define Z_OBJ_HANDLE(zval) Z_OBJVAL(zval).handle

#define Z_OBJ_HANDLE_P(zval_p) Z_OBJ_HANDLE(*zval_p)

#define Z_OBJ_HANDLE_PP(zval_p) Z_OBJ_HANDLE(**zval_p)

#define Z_OBJ_HT(zval) Z_OBJVAL(zval).handlers

#define Z_OBJ_HT_P(zval_p) Z_OBJ_HT(*zval_p)

#define Z_OBJ_HT_PP(zval_p) Z_OBJ_HT(**zval_p)

#define Z_OBJCE(zval) zend_get_class_entry(&(zval) TSRMLS_CC)

#define Z_OBJCE_P(zval_p) Z_OBJCE(*zval_p)

#define Z_OBJCE_PP(zval_pp) Z_OBJCE(**zval_pp)

#define Z_OBJPROP(zval) Z_OBJ_HT((zval))->get_properties(&(zval) TSRMLS_CC)

#define Z_OBJPROP_P(zval_p) Z_OBJPROP(*zval_p)

#define Z_OBJPROP_PP(zval_pp) Z_OBJPROP(**zval_pp)

#define Z_OBJ_HANDLER(zval, hf) Z_OBJ_HT((zval))->hf

#define Z_OBJ_HANDLER_P(zval_p, h) Z_OBJ_HANDLER(*zval_p, h)

#define Z_OBJ_HANDLER_PP(zval_p, h) Z_OBJ_HANDLER(**zval_p, h)

#define Z_OBJDEBUG(zval,is_tmp) (Z_OBJ_HANDLER((zval),get_debug_info)? \

Z_OBJ_HANDLER((zval),get_debug_info)(&(zval),&is_tmp TSRMLS_CC): \

(is_tmp=0,Z_OBJ_HANDLER((zval),get_properties)?Z_OBJPROP(zval):NULL))

#define Z_OBJDEBUG_P(zval_p,is_tmp) Z_OBJDEBUG(*zval_p,is_tmp)

#define Z_OBJDEBUG_PP(zval_pp,is_tmp) Z_OBJDEBUG(**zval_pp,is_tmp)

// 操作资源的

#define Z_RESVAL(zval) (zval).value.lval

#define Z_RESVAL_P(zval_p) Z_RESVAL(*zval_p)

#define Z_RESVAL_PP(zval_pp) Z_RESVAL(**zval_pp)

#define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }

#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }

#define RETURN_NULL() { RETVAL_NULL(); return;}

#define RETURN_LONG(l) { RETVAL_LONG(l); return; }

#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }

#define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; }

#define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }

#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }

#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }

#define RETURN_FALSE { RETVAL_FALSE; return; }

#define RETURN_TRUE



推荐阅读
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
  • 在CodeIgniter框架中集成新库文件的过程中,我遇到了一些困惑。具体来说,在跟随nettuts的认证教程时,对于在Welcome控制器中添加的构造函数代码,特别是关于Session的验证部分,我感到不太理解。这部分内容涉及如何确保Session已经初始化并具备相应的功能,这对于实现用户认证至关重要。为了更好地掌握这一知识点,我计划深入研究CodeIgniter的官方文档,并参考更多相关资源,以确保能够正确地集成和使用新库文件。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • PHP 数组逆序排列方法及常用排序函数详解 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 在使用 `useSelector` 选择器时,发现分派操作后状态未能实时更新。这可能是由于 React 组件的渲染机制或 Redux 的状态管理问题导致的。建议检查 `useSelector` 的依赖项和 `dispatch` 的调用时机,确保状态变化能够正确触发组件重新渲染。此外,可以考虑使用 `useEffect` 钩子来监听状态变化,以确保及时更新。 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • 《精通 jQuery》第六章:深入解析与实战应用
    《精通 jQuery》第六章:深入解析与实战应用本章详细探讨了 Ajax 技术的核心机制及其实际应用。Ajax 通过 XMLHttpRequest 对象实现客户端与服务器之间的异步数据交换,从而在不重新加载整个页面的情况下更新部分内容。这种技术不仅提升了用户体验,还提高了应用的响应速度和效率。此外,本章还介绍了如何利用 jQuery 简化 Ajax 操作,并提供了多个实战案例,帮助读者更好地理解和掌握这一重要技术。 ... [详细]
  • 在2021-2022 ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 在Bugku Web CTF实战演练中,通过细致的源代码检查,我们发现了一个隐藏的滑稽笑脸图标,进一步分析后成功找到了flag。此外,还探讨了如何利用计算器功能进行安全测试,提升了对Web漏洞的识别和利用技巧。 ... [详细]
  • 每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)
    题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0, 2^1, …, 2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
author-avatar
手机用户2502854251
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有