php扩展 zval_copy_ctor,zend api扩展的php对象的autoload工具
类似spl的autoload功能,bloader为php对象的autoload工具,但相比较起来更简单高效,配置也更灵活.
bloader提供一个常用的autoload函数ld,以及两个辅助函数,ld_new(实例化)和ld_unset(销毁对象).
#1 bloader会自动搜索当前文件 或 当前目录下的.class.php文件,以及通过'_MODULES'常量定义的路径,实例化类返回对象.
#2 可直接使用ld('类名')操作对象(见实例 1-1)
#3 bloader会在当前作用域自动注册一个以类名为变量名的变量'$类名'(见实例 1-2)
#4 bloader中使用ld函数访问对象是全局范围有效 (见实例 1-3)
#5 使用ld_new实例化多个不同的对象,而不注册变量 (见实例 1-4)
#6 使用ld_unset注销已经实例化的对象 (见实例 1-5)
下载地址:http://code.google.com/p/bloader/downloads/detail?name=bloader.tar.gz
安装:
phpize
./configure --with-php-config=php-config --enable-bloader
make && make install
实例 1-1
///define('_MODULES',dirname( __FILE__ ).'/class'); ///可选配置,在指定目录下查找类文件,以便于实例化
ld('c1',array('1','2'))->a1="a1"; ///参数2为构造函数的参数
ld('c1')->a2='a2';
ld('c1')->printt();
/**
show:
c1 Object
(
[a1] => a1
[a2] => a2
[a3] => Array
(
[0] => 1
[1] => 2
)
)
*/
?>
/**
example:
./class/c1.class.php:
*/
class c1
{
public $a1=123;
public $a2='abc';
public $a3=100;
public function __construct($ls)
{
$this->a3=$ls;
}
public function printt()
{
print_r(ld('c1')); /**使用了全局特性*/
}
}
?>
实例 1-2
...
ld('users');
//自动注册了$users变量
$users->method();
....
?>
实例 1-3
ld('users');
printt(); //打印对象
...
function printt()
{
var_dump(ld('users'));
}
?>
实例 1-4
$users_1=ld_new('users');
$users_2=ld_new('users');
...
?>
实例 1-5
ld('users');
unset_users();
...
function unset_users()
{
ld_unset('users');
}
?>
奉上主要代码供拍砖
...
PHP_FUNCTION(ld)
{
char *obj_name;
int slen;
zval **var,*para = NULL;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS)
{
zend_error(E_ERROR, "parameters failed.");
}
else
{
zval_dtor(return_value);
if(zend_hash_find(&EG(symbol_table),obj_name,slen+1,(void **) &var)!=SUCCESS)
{
ld_autoload_path(obj_name TSRMLS_DC);
*return_value = *ld_new_class(obj_name,slen,para,1);
}
else
{
*return_value = **var;
}
zval_copy_ctor(return_value);
}
}
PHP_FUNCTION(ld_new)
{
char *obj_name;
int slen;
zval *para = NULL;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS)
{
zend_error(E_ERROR, "parameters failed.");
}
else
{
zval_dtor(return_value);
ld_autoload_path(obj_name TSRMLS_DC);
*return_value = *ld_new_class(obj_name,slen,para,0);
zval_copy_ctor(return_value);
}
}
PHP_FUNCTION(ld_unset)
{
char *obj_name;
int slen;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &obj_name,&slen) != SUCCESS)
{
zend_error(E_ERROR, "parameters failed.");
}
else
{
zend_hash_del(&EG(symbol_table),obj_name,slen+1);
RETURN_TRUE;
}
}
/* }}} */
static zval *ld_new_class(char *obj_name,int slen,zval *para,int is_set)
{
zval *obj;
zend_class_entry **class_entry;
zend_function *constructor;
MAKE_STD_ZVAL(obj);
if(zend_lookup_class(obj_name, slen, &class_entry TSRMLS_CC)==SUCCESS)
{
object_init_ex(obj, *class_entry);
constructor = Z_OBJ_HT_P(obj)->get_constructor(obj TSRMLS_CC);
if (constructor != NULL)
{
int is_arg = (para == NULL) ? 0 : 1;
zend_call_method(&obj, *class_entry,&constructor, "__construct", 11, NULL, is_arg, para, NULL TSRMLS_CC);
}
if(is_set==1) ZEND_SET_SYMBOL(&EG(symbol_table),obj_name, obj);
}
else
{
ZVAL_FALSE(obj);
}
return obj;
}
static int ld_autoload_path(char *class_name TSRMLS_DC)
{
char *ext_name = ".class.php";
char *file_path;
zval const_root;
int path_len = spprintf(&file_path, 0, "%s%s",class_name,ext_name);
if(ld_autoload_file(file_path,path_len TSRMLS_DC)==SUCCESS) return SUCCESS;
if(zend_get_constant("_MODULES",8,&const_root TSRMLS_CC))
//if(zend_get_constant_ex("_MODULES",8,const_root,NULL, 0 TSRMLS_CC)) //ZEND_FETCH_CLASS_SILENT
{
if(Z_TYPE(const_root) == IS_STRING)
{
char *root_file_path;
int root_path_len = spprintf(&root_file_path, 0, "%s/%s", Z_STRVAL(const_root),file_path);
return ld_autoload_file(root_file_path,root_path_len TSRMLS_DC);
}
}
return FAILURE;
}
static int ld_autoload_file(char *file_path,int file_path_len TSRMLS_DC) /* {{{ */
{
zend_file_handle file_handle;
if (php_stream_open_for_zend_ex(file_path, &file_handle, ENFORCE_SAFE_MODE|USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS)
{
zend_op_array *new_op_array;
unsigned int dummy = 1;
if (!file_handle.opened_path) file_handle.opened_path = estrndup(file_path, file_path_len);
if (zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS)
{
new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
}
else
{
new_op_array = NULL;
zend_file_handle_dtor(&file_handle TSRMLS_CC);
}
if (new_op_array)
{
zval *result = NULL;
EG(return_value_ptr_ptr) = &result;
EG(active_op_array) = new_op_array;
if (!EG(active_symbol_table)) zend_rebuild_symbol_table(TSRMLS_C);
zend_execute(new_op_array TSRMLS_CC);
destroy_op_array(new_op_array TSRMLS_CC);
efree(new_op_array);
if (!EG(exception)) if (EG(return_value_ptr_ptr))
zval_ptr_dtor(EG(return_value_ptr_ptr));
}
return SUCCESS;
}
return FAILURE;
}
...
php扩展 zval_copy_ctor,zend api扩展的php对象的autoload工具相关推荐
- Zend扩展开发:Zend API:Zend_parse_parameters
Zend API:Zend_parse_parameters 对于扩展来说,最重要的一件事就是如何接收和处理那些通过函数参数传递而来的数据.大多数扩展都是用来处理某些特定的输入数据(或者是根据参数来决 ...
- Zend API:深入 PHP 内核
http://roygu.com/doc/blog/dive-to-php-core.html Zend API:深入 PHP 内核 译序及目录 译序 网上关于 PHP 的资料多如牛毛,关于其核心 Z ...
- php sapi zend,108 内核探索 --php扩展、zend引擎、sapi
php内核探索系列文章 :http://www.nowamagic.net/librarys/veda/detail/1285 1.php请求流程 先看一个php请求的运行流程: 浏览器用户---&g ...
- 【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
文章目录 一.Gradle 自动下载并配置构建环境 二.Gradle 提供 API 扩展与开发工具集成 三.Gradle 内置 Maven 和 Ivy 依赖管理 四.Gradle 使用 Groovy ...
- php zend gua,PHP安装使用Zend Opcache扩展
简介 Zend OPCache 的前身是Zend Optimizer + (Zend O+),于 2013年3月中旬改名为 Opcache.其通过 opcode 缓存和优化提供更快的 PHP 执行过程 ...
- OpenCV 4.0 rc版本发布,扩展计算图Graph API
点击我爱计算机视觉标星,更快获取CVML新技术 rc版本即正式发布前的候选版(release candidate),指在重大版本号升级前,几乎已经完工了,但为避免可能的百密一疏,先让大家"测 ...
- PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看
catalogue 1. 编译PHP源码 2. 扩展结构.优缺点 3. 使用PHP原生扩展框架wizard ext_skel编写扩展 4. 编译安装VLD 5. Debug调试VLD 6. VLD源码 ...
- php扩展兼容,PHP扩展迁移为PHP7扩展兼容性问题记录,php7兼容性_PHP教程
PHP扩展迁移为PHP7扩展兼容性问题记录,php7兼容性 PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容.有不少方法参数做了调整.下面是在迁移过程中遇到的一些问题. ...
- 【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )
文章目录 一.扩展方法示例 二.实例扩展方法配置 三.编译实例扩展类 四.打包静态扩展类字节码到 jar 包中 五.测试使用 Thread 实例扩展方法 一.扩展方法示例 为 Thread 扩展 he ...
最新文章
- #Ubuntu 18.04 安装tensorflow-gpu 1.9
- ospf专题二:虚链路
- 深度学习和目标检测系列教程 3-300:了解常见的目标检测的开源数据集
- Go 语言中的 new() 和 make()的区别
- 数字图像处理 第二章 图像处理基础
- 前端如何查看音频的长度_Android音频可视化
- 解决Intellij IDEA运行报Command line is too long的问题
- BI与大数据之间的差距有哪些
- Fuse Audio Labs VCS-1 Mac - 零延迟通道条插件
- MIPI CSI转TTL/LVDS/BT656/BT601/BT1120
- 华为麒麟将成“绝版”,造芯为什么这么难?
- congestion_controller、 remote bitrate estimator、pacing模块浅析
- API拦截方法一:PE简介
- 用于Brain Runners电子游戏的改进SmallNet脑电解码分类
- 使用Excel数据分析工具进行多元回归分析
- 8位串行输入串行输出移位寄存器的Verilog设计
- unity第三人称射击游戏_在游戏上第3部分完美的信息游戏
- 西电研究生毕业论文latex模板使用指南
- 我们月光工作室和我们的3款游戏被国内Unity3D游戏引擎第一技术论坛--“游戏蛮牛” 报道啦!...
- XShell 还是 FinalShell?
热门文章
- Zabbix-3.0.3结合Grafana-3.1.0给你想要的绘图
- jquery判断多选框是否选中
- Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
- 【转】FPGA+CPU:并行处理大行其道
- MySQL 全局锁和表锁
- 要继续使用 App Engine 标准应用,您必须在 2021 年 1 月 31 日之前添加付款信息。
- 人脸识别成创业热门,统计企业超1万家,刷脸支付项目将迎来热潮
- C#(WinForm)的Show()和ShowDialog()方法介绍
- 计算机视觉:值得一读的五本计算机视觉教科书
- 深度神经网络:WX+B vs XW+B,作者原文已经删除,转载过来了~~~