文档章节

php扩展资源类

刘德生
 刘德生
发布于 2014/05/26 15:44
字数 340
阅读 252
收藏 2

int le_conn; //资源表示定义成全局,在模块初始化阶段,zend会给每个资源分配唯一的id

zend_class_entry *spread_class_entry; //全局定义类

static zend_function_entry spread_class_functions[] = { //类方法可以直接映射到函数,这样既可以直接访问函数也可以面向对象,mysqli应该就是这种方式

ZEND_MALIAS(Spread, __construct, spread_constructor, arginfo_spread___construct,  ZEND_ACC_PUBLIC)

PHP_ME_MAPPING(connect,         spread_connect,         arginfo_spread_oop_connect,  0)

PHP_ME_MAPPING(disconnect,      spread_disconnect,      arginfo_spread_oop_disconnect,  0)

PHP_ME_MAPPING(join,            spread_join,            arginfo_spread_oop_join,  0)

PHP_ME_MAPPING(leave,           spread_leave,           arginfo_spread_oop_join,  0)

PHP_ME_MAPPING(receive,         spread_receive,         arginfo_spread_oop_receive,  0)

PHP_ME_MAPPING(multicast,       spread_multicast,       arginfo_spread_oop_multicast,  0)

PHP_FE_END

};


//定义宏为类添加常量

#define REGISTER_SPREAD_CLASS_CONST_LONG(const_name, value) \

zend_declare_class_constant_long(spread_class_entry, const_name, sizeof(const_name)-1, (long)value TSRMLS_CC);

PHP_MINIT_FUNCTION(spread) //模块初始化中定义类

{

      zend_class_entry spread_ce;

     memcpy(&spread_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));

     spread_object_handlers.clone_obj      = NULL;

     INIT_CLASS_ENTRY(spread_ce, "Spread", spread_class_functions);

    spread_ce.create_object = spread_object_new;

    spread_class_entry = zend_register_internal_class(&spread_ce TSRMLS_CC);

  //定义资源

    le_conn = zend_register_list_destructors_ex(php_spread_rsr_dtor, NULL, "spread", module_number);

}

ZEND_REGISTER_RESOURCE(return_value, mbox, le_conn); //注册资源,通过le_conn关联定义的资源,mbox为资源变量,资源析构函数php_spread_rsr_dtor参数zend_rsrc_list_entry *rsrc的ptr指针指向mbox。


//更新类属性

zend_update_property_stringl(spread_class_entry, this, "daemon", sizeof("daemon") - 1, spread_name, spread_name_len TSRMLS_CC);

//直接定义类方法

PHP_METHOD(Spread, spread_constructor)

{

zval *object = getThis(); //获取当前类对象

zval *groups_array;

      //添加属性

add_property_bool(object, "connected", 0);

add_property_null(object, "daemon");

add_property_null(object, "private_name");

add_property_null(object, "private_group");

MAKE_STD_ZVAL(groups_array); 

array_init(groups_array);

add_property_zval(object, "joined_groups", groups_array);


/* add_prop_zval increments the refcount, useless here */

zval_ptr_dtor(&groups_array);

}


retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) spread_object_free_storage, NULL TSRMLS_CC); //将资源放入资源池,返回索引


(ze_spread_object *) zend_object_store_get_object(object TSRMLS_CC); //获取对象池中bucket中的对象,传入值为对象

© 著作权归作者所有

上一篇: PHP 实现短url代码
下一篇: 排列c++转php
刘德生
粉丝 6
博文 31
码字总数 7876
作品 0
海淀
高级程序员
私信 提问
haiker/zhaoma-framework

zhaoma-framework 开发初衷: 此框架开始设计于2013年,当时公司正在做一个企业项目,在此项目中甲方明确要求使用PHP语言,而项目中所有人员均为Java程序员,并且零PHP基础。 项目周期十分紧...

haiker
2015/12/09
0
0
如何编写一个独立的PHP扩展

独立的 PHP 扩展可以独立于 PHP 源码之外进行分发。要创建一个这样的扩展,需要准备好两样东西: 配置文件 (config.m4) 你的模块源码 接下来我们来描述一下如果创建这些文件并组合起来。 准备...

snowing1990
2016/04/11
66
0
Phalcon 2 beta 2 发布,高性能 PHP 框架

Phalcon 2.0 基于高性能编译语言Zephir,Zephir的目的是提供一个全新的更简单的语法来编写PHP扩展。 Phalcon 2.0 beta 2 实现了大部分 Phalcom 1.x 的功能,同时通过了 Travis 大量重要的测试...

raykwok
2014/08/29
3.8K
27
Laravel框架一:原理机制篇

http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点。 一. 请求周期   Laravel 采用了单一入口模式,应用...

hisense20112784
2017/08/11
0
0
Phalcon 1.3.3 发布,高性能 PHP 框架

Phalcon 1.3.3 发布,此版本现已提供下载,是个维护版本,包括一些 bug 修复。 PhalconPHP 是一个使用 C 扩展开发的 PHP Web 框架,提供高性能和低资源占用。 Phalcon 是一个开源的、全堆栈的...

raykwok
2014/09/23
2.7K
13

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
9分钟前
2
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
9分钟前
2
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
14分钟前
2
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
14分钟前
2
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部