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

前端之家收集整理的这篇文章主要介绍了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
<div class="codetitle"><a style="CURSOR: pointer" data="12495" class="copybut" id="copybut12495" onclick="doCopy('code12495')"> 代码如下:

<div class="codebody" id="code12495">
<?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
)
)
*/
?>

<div class="codetitle"><a style="CURSOR: pointer" data="4209" class="copybut" id="copybut4209" onclick="doCopy('code4209')"> 代码如下:
<div class="codebody" id="code4209">
<?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
<div class="codetitle"><a style="CURSOR: pointer" data="82182" class="copybut" id="copybut82182" onclick="doCopy('code82182')"> 代码如下:
<div class="codebody" id="code82182">
<?PHP
...
ld('users');
//自动注册了$users变量
$users->method();
....
?>

实例 1-3
<div class="codetitle"><a style="CURSOR: pointer" data="21703" class="copybut" id="copybut21703" onclick="doCopy('code21703')"> 代码如下:
<div class="codebody" id="code21703">
<?PHP
ld('users');
printt(); //打印对象
...
function printt()
{
var_dump(ld('users'));
}
?>

实例 1-4
<div class="codetitle"><a style="CURSOR: pointer" data="3140" class="copybut" id="copybut3140" onclick="doCopy('code3140')"> 代码如下:<div class="codebody" id="code3140">
<?PHP
$users_1=ld_new('users');
$users_2=ld_new('users');
...
?>

实例 1-5
<div class="codetitle"><a style="CURSOR: pointer" data="85387" class="copybut" id="copybut85387" onclick="doCopy('code85387')"> 代码如下:<div class="codebody" id="code85387">
<?PHP
ld('users');
unset_users();
...
function unset_users()
{
ld_unset('users');
}
?>

奉上主要代码供拍砖 <div class="codetitle"><a style="CURSOR: pointer" data="12090" class="copybut" id="copybut12090" onclick="doCopy('code12090')"> 代码如下:<div class="codebody" id="code12090">
...
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,"parameters Failed.");
}
else
{
zval_dtor(return_value);
ld_autoload_path(obj_name TSRMLS_DC);
return_value = ld_new_class(obj_name,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",&slen) != SUCCESS)
{
zend_error(E_ERROR,"parameters Failed.");
}
else
{
zend_hash_del(&EG(symbol_table),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,&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,NULL TSRMLS_CC);
}
if(is_set==1) ZEND_SET_SYMBOL(&EG(symbol_table),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,"%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",const_root,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,"%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;
}
...

原文链接:https://www.f2er.com/php/28061.html
autoloadphp

猜你在找的PHP相关文章