- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PHP与CPHPC语言类型
使用C++11开发PHP7扩展
@hantianfeng Rango-韩天峰
PHP原生扩展
01
PHP的扩展加载过程
1. Zend引擎的 php_load_extension 函数
2. 加载并执行so中 get_module 函数,返回 zend_module_entry
3. struct中设置了M(R)INIT、M(R)SHUTDOWN 4个函数指针
4. 执行 zend_startup_module_ex 函数启动扩展
5. PHP扩展加载依赖 glibc 的 dl 库,是标准的 Linux 动态链接库
创建 PHP 的扩展工程
1. 扩展骨架生成工具:ext_skel
2. 编辑 config.m4
3. 修改 extension.h 头文件定义扩展的函数
4. 修改 extension.c 源文件,实现函数的逻辑
5. phpize、configure、make、make install
6. 建议:参考其他扩展的源码
编写 PHP 扩展 - 基本类型
编写 PHP 扩展 - 类型推断
编写 PHP 扩展 - 类型转换
编写 PHP 扩展 - 参数输入
编写 PHP 扩展 - 参数输入
b : 布尔值,l :整型(long) ,d :浮点型(double)
s :字符串(char **, long *) ,a :数组,z :任意PHP变量
| :可选参数, :引用
坑 :1. 字符串长度PHP7必须为long ,PHP5为int
2. 整型必须为long ,不能是int
3. 浮点型必须为double ,不能是float
编写 PHP 扩展 - 输出返回值
1. 修改 return_value 实现返回值
2. 使用 RETURN_* 宏
编写 PHP 扩展 - 数组操作
编写 PHP 扩展 - 数组添加
编写 PHP 扩展 - 数组操作
编写 PHP 扩展 - 对象操作
编写 PHP 扩展 - 更多
1. 遍历数组
2. 使用资源类型
3. 实现一个扩展类
4. 引用计数管理
5. ……
编写 PHP 扩展 - 坑
1. zend_update_property 是否要对zval增加引用计数
2. Immutable 数组修改导致崩溃
3. API函数风格不统一,有的是SUCCESS ,有的是False
Zend API 的问题
1. 大量使用宏
2. API 名称太长,参数太多,无法记住
3. API 分散在众多 .h 和 .c 文件中
4. C语言开发 ,大量使用指针,容易出错
5. 没有任何教程或手册
C or C++
C语言
• 50年历史的古老编程语言
• 面向过程风格,函数夹杂着宏,封装性差
• 使用宏和万能指针
• 未提供数据结构
• 仅适合编写底层软件
C++11
• 现代编程语言
• 面向对象风格,对象属性和方法,封装性好
• 模版泛型编程
• STL容器
• 通用编程
PHP 与 C++
PHP C++
语言类型 动态,弱类型 静态,强类型
计算性能 差 强
执行方式 编译生成中间码,解释执行 编译为机器指令,直接执行
开发效率
文档评论(0)