• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

zend api扩展的php对象的autoload工具_php技巧

php 搞代码 4年前 (2022-01-26) 16次浏览 已收录 0个评论

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

 <BR><?p<strong>*本文来源gaodai#ma#com搞@代~码^网+</strong><strong>搞代gaodaima码</strong>hp <BR>///define('_MODULES',dirname( __FILE__ ).'/class'); ///可选配置,在指定目录下查找类文件,以便于实例化 <BR>ld('c1',array('1','2'))->a1="a1"; ///参数2为构造函数的参数 <BR>ld('c1')->a2='a2'; <BR>ld('c1')->printt(); <br><br>/** <BR>show: <BR>c1 Object <BR>( <BR>[a1] => a1 <BR>[a2] => a2 <BR>[a3] => Array <BR>( <BR>[0] => 1 <BR>[1] => 2 <BR>) <BR>) <BR>*/ <BR>?> <BR>


 <BR><?php <BR>/** <BR>example: <BR>./class/c1.class.php: <BR>*/ <BR>class c1 <BR>{ <BR>public $a1=123; <BR>public $a2='abc'; <BR>public $a3=100; <BR>public function __construct($ls) <BR>{ <BR>$this->a3=$ls; <BR>} <BR>public function printt() <BR>{ <BR>print_r(ld('c1')); /**使用了全局特性*/ <BR>} <BR>} <BR>?> <BR>


实例 1-2

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


实例 1-3

 <BR><?php <BR>ld('users'); <BR>printt(); //打印对象 <BR>... <BR>function printt() <BR>{ <BR>var_dump(ld('users')); <BR>} <BR>?> <BR>


实例 1-4

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


实例 1-5

 <BR><?php <BR>ld('users'); <BR>unset_users(); <BR>... <BR>function unset_users() <BR>{ <BR>ld_unset('users'); <BR>} <BR>?> <BR>


奉上主要代码供拍砖

 <BR>... <BR>PHP_FUNCTION(ld) <BR>{ <BR>char *obj_name; <BR>int slen; <BR>zval **var,*para = NULL; <BR>if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS) <BR>{ <BR>zend_error(E_ERROR, "parameters failed."); <BR>} <BR>else <BR>{ <BR>zval_dtor(return_value); <BR>if(zend_hash_find(&EG(symbol_table),obj_name,slen+1,(void **) &var)!=SUCCESS) <BR>{ <BR>ld_autoload_path(obj_name TSRMLS_DC); <BR>*return_value = *ld_new_class(obj_name,slen,para,1); <BR>} <BR>else <BR>{ <BR>*return_value = **var; <BR>} <BR>zval_copy_ctor(return_value); <BR>} <BR>} <BR>PHP_FUNCTION(ld_new) <BR>{ <BR>char *obj_name; <BR>int slen; <BR>zval *para = NULL; <BR>if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS) <BR>{ <BR>zend_error(E_ERROR, "parameters failed."); <BR>} <BR>else <BR>{ <BR>zval_dtor(return_value); <BR>ld_autoload_path(obj_name TSRMLS_DC); <BR>*return_value = *ld_new_class(obj_name,slen,para,0); <BR>zval_copy_ctor(return_value); <BR>} <BR>} <BR>PHP_FUNCTION(ld_unset) <BR>{ <BR>char *obj_name; <BR>int slen; <BR>if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &obj_name,&slen) != SUCCESS) <BR>{ <BR>zend_error(E_ERROR, "parameters failed."); <BR>} <BR>else <BR>{ <BR>zend_hash_del(&EG(symbol_table),obj_name,slen+1); <BR>RETURN_TRUE; <BR>} <BR>} <BR>/* }}} */ <br><br>static zval *ld_new_class(char *obj_name,int slen,zval *para,int is_set) <BR>{ <BR>zval *obj; <BR>zend_class_entry **class_entry; <BR>zend_function *constructor; <BR>MAKE_STD_ZVAL(obj); <BR>if(zend_lookup_class(obj_name, slen, &class_entry TSRMLS_CC)==SUCCESS) <BR>{ <BR>object_init_ex(obj, *class_entry); <BR>constructor = Z_OBJ_HT_P(obj)->get_constructor(obj TSRMLS_CC); <BR>if (constructor != NULL) <BR>{ <BR>int is_arg = (para == NULL) ? 0 : 1; <BR>zend_call_method(&obj, *class_entry,&constructor, "__construct", 11, NULL, is_arg, para, NULL TSRMLS_CC); <BR>} <BR>if(is_set==1) ZEND_SET_SYMBOL(&EG(symbol_table),obj_name, obj); <BR>} <BR>else <BR>{ <BR>ZVAL_FALSE(obj); <BR>} <BR>return obj; <BR>} <br><br>static int ld_autoload_path(char *class_name TSRMLS_DC) <BR>{ <BR>char *ext_name = ".class.php"; <BR>char *file_path; <BR>zval const_root; <BR>int path_len = spprintf(&file_path, 0, "%s%s",class_name,ext_name); <BR>if(ld_autoload_file(file_path,path_len TSRMLS_DC)==SUCCESS) return SUCCESS; <BR>if(zend_get_constant("_MODULES",8,&const_root TSRMLS_CC)) <BR>//if(zend_get_constant_ex("_MODULES",8,const_root,NULL, 0 TSRMLS_CC)) //ZEND_FETCH_CLASS_SILENT <BR>{ <BR>if(Z_TYPE(const_root) == IS_STRING) <BR>{ <BR>char *root_file_path; <BR>int root_path_len = spprintf(&root_file_path, 0, "%s/%s", Z_STRVAL(const_root),file_path); <BR>return ld_autoload_file(root_file_path,root_path_len TSRMLS_DC); <BR>} <BR>} <BR>return FAILURE; <BR>} <BR>static int ld_autoload_file(char *file_path,int file_path_len TSRMLS_DC) /* {{{ */ <BR>{ <BR>zend_file_handle file_handle; <BR>if (php_stream_open_for_zend_ex(file_path, &file_handle, ENFORCE_SAFE_MODE|USE_PATH|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC) == SUCCESS) <BR>{ <BR>zend_op_array *new_op_array; <BR>unsigned int dummy = 1; <BR>if (!file_handle.opened_path) file_handle.opened_path = estrndup(file_path, file_path_len); <BR>if (zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) <BR>{ <BR>new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE TSRMLS_CC); <BR>zend_destroy_file_handle(&file_handle TSRMLS_CC); <BR>} <BR>else <BR>{ <BR>new_op_array = NULL; <BR>zend_file_handle_dtor(&file_handle TSRMLS_CC); <BR>} <BR>if (new_op_array) <BR>{ <BR>zval *result = NULL; <BR>EG(return_value_ptr_ptr) = &result; <BR>EG(active_op_array) = new_op_array; <BR>if (!EG(active_symbol_table)) zend_rebuild_symbol_table(TSRMLS_C); <BR>zend_execute(new_op_array TSRMLS_CC); <BR>destroy_op_array(new_op_array TSRMLS_CC); <BR>efree(new_op_array); <BR>if (!EG(exception)) if (EG(return_value_ptr_ptr)) <BR>zval_ptr_dtor(EG(return_value_ptr_ptr)); <BR>} <BR>return SUCCESS; <BR>} <BR>return FAILURE; <BR>} <BR>... <BR>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:zend api扩展的php对象的autoload工具_php技巧

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址