最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

zend api擴展的php對象的autoload工具

 更新時間:2011年04月18日 01:09:20   作者:  
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;
}
...

相關文章

  • 小結下MySQL中文亂碼,phpmyadmin亂碼,php亂碼 產生原因及其解決方法

    小結下MySQL中文亂碼,phpmyadmin亂碼,php亂碼 產生原因及其解決方法

    小結下MySQL中文亂碼,phpmyadmin亂碼,php亂碼 產生原因及其解決方法...
    2007-09-09
  • php用戶登錄之cookie信息安全分析

    php用戶登錄之cookie信息安全分析

    這篇文章主要介紹了php用戶登錄之cookie信息安全,介紹了cookie加密與令牌保護兩種cookie信息安全保護的技巧,需要的朋友可以參考下
    2016-05-05
  • php 多繼承的幾種常見實現方法示例

    php 多繼承的幾種常見實現方法示例

    這篇文章主要介紹了php 多繼承的幾種常見實現方法,結合實例形式分析了兩種PHP實現多繼承的操作方法,需要的朋友可以參考下
    2019-11-11
  • PHP 返回13位時間戳的實現代碼

    PHP 返回13位時間戳的實現代碼

    下面小編就為大家?guī)硪黄狿HP 返回13位時間戳的實現代碼。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • PHP模擬QQ登錄的方法

    PHP模擬QQ登錄的方法

    這篇文章主要介紹了PHP模擬QQ登錄的方法,涉及php基于curl操作模擬QQ登錄的實現技巧,具有一定參考
    2015-07-07
  • PHP實現猜數游戲

    PHP實現猜數游戲

    這篇文章主要為大家詳細介紹了PHP實現猜數游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • php ajax異步讀取rss文檔數據

    php ajax異步讀取rss文檔數據

    這篇文章主要介紹了php ajax異步讀取rss文檔數據的相關資料,RSS是一種描述和同步網站內容的格式,需要的朋友可以參考下
    2016-03-03
  • PHP面向對象概念

    PHP面向對象概念

    要詳細了解PHP OO最好看PHP手冊。大家都知道的部分就不說了,這里只記下容易忘記的部分
    2011-11-11
  • PHP完全二叉樹定義與實現方法示例

    PHP完全二叉樹定義與實現方法示例

    這篇文章主要介紹了PHP完全二叉樹定義與實現方法,簡單描述了完全二叉樹的概念并結合實例形式給出了完全二叉樹的定義、節(jié)點查找、添加、設置、打印等相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • php數組添加元素方法小結

    php數組添加元素方法小結

    這篇文章主要介紹了php數組添加元素方法,實例總結了常見的數組添加元素的方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12

最新評論

疏勒县| 保山市| 封丘县| 柳州市| 吉木乃县| 谷城县| 泊头市| 沅陵县| 吴桥县| 乐山市| 黔南| 赤水市| 静海县| 永川市| 武邑县| 遂平县| 封开县| 娄底市| 普格县| 稻城县| 全南县| 垫江县| 阜阳市| 铜梁县| 丰城市| 龙海市| 奉节县| 常山县| 威远县| 南京市| 建昌县| 潞西市| 甘孜县| 沁阳市| 塔城市| 田林县| 武清区| 台安县| 阳信县| 攀枝花市| 连山|