服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - PHP教程 - zend api扩展的php对象的autoload工具

zend api扩展的php对象的autoload工具

2019-11-21 13:56PHP教程网 PHP教程

bloader提供一个常用的autoload函数ld,以及两个辅助函数,ld_new(实例化)和ld_unset(销毁对象).

类似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 

复制代码代码如下:


<?php 
///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 


*/ 
?> 

 

复制代码代码如下:


<?php 
/** 
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 

复制代码代码如下:


<?php 
... 
ld('users'); 
//自动注册了$users变量 
$users->method(); 
.... 
?> 


实例 1-3 

复制代码代码如下:


<?php 
ld('users'); 
printt(); //打印对象 
... 
function printt() 

var_dump(ld('users')); 

?> 


实例 1-4 

复制代码代码如下:


<?php 
$users_1=ld_new('users'); 
$users_2=ld_new('users'); 
... 
?> 


实例 1-5 

复制代码代码如下:


<?php 
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教程为PHP初学者的8点有效建议

    为PHP初学者的8点有效建议

    如果你还不清楚PHP是什么,可以留意下那些你天天使用的web应 用,例如Facebook、Wordpress都是用PHP构建起来的。 ...

    php教程网2182019-11-12
  • PHP教程PHP中MVC模式的模板引擎开发经验分享

    PHP中MVC模式的模板引擎开发经验分享

    MVC是模型(Model)、视图(View)和控制(Controller)的缩写,PHP中采用MVC模式的目的是实现Web系统的职能分工,通俗的说就是把业务逻辑处理从用户界面视图中分离出...

    cnblogs3022019-11-19
  • PHP教程PHP设计模式之模板模式定义与用法详解

    PHP设计模式之模板模式定义与用法详解

    这篇文章主要介绍了PHP设计模式之模板模式定义与用法,较为详细的说明了模板模式的原理、功能、应用及php定义、使用模板模式的相关操作技巧,代码简单...

    天涯海角路4062019-07-15
  • PHP教程在PHP中使用curl_init函数的说明

    在PHP中使用curl_init函数的说明

    在这篇文章中主要讲解php_curl库的知识,并教你如何更好的使用php_curl。 ...

    php教程网3742019-11-12
  • PHP教程PHP序列号生成函数和字符串替换函数代码

    PHP序列号生成函数和字符串替换函数代码

    两个函数,如果对你有用,我很高兴。第一个是用来生成序列号,随便改。第二个是用来“加密”部分字符串,稍微修改一下,就能达到我们在找回密码时...

    PHP之家3862019-06-19
  • PHP教程PHP PDOStatement::execute讲解

    PHP PDOStatement::execute讲解

    今天小编就为大家分享一篇关于PHP PDOStatement::execute讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    php参考手册4752019-06-24
  • PHP教程Laravel利用gulp如何构建前端资源详解

    Laravel利用gulp如何构建前端资源详解

    Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务,下面这篇文章主要给大家介绍了关于Laravel利用gulp如何构建前端资源的相关资料,文中通过...

    小谈4922019-09-29
  • PHP教程PHP实现负载均衡下的session共用功能

    PHP实现负载均衡下的session共用功能

    这篇文章主要介绍了PHP实现负载均衡下的session共用功能,结合实例形式分析了php基于memcache的session共享相关实现技巧,需要的朋友可以参考下 ...

    PHP群:2234946784872019-10-12