本文主要为广大网友提供“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
复制代码 代码如下:
<?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
=> 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);
RET