欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2011年04月18日 01:09:20   作者:  
bloader提供一個常用的autoload函數(shù)ld,以及兩個輔助函數(shù),ld_new(實例化)和ld_unset(銷毀對象).
類似spl的autoload功能,bloader為php對象的autoload工具,但相比較起來更簡單高效,配置也更靈活.

bloader提供一個常用的autoload函數(shù)ld,以及兩個輔助函數(shù),ld_new(實例化)和ld_unset(銷毀對象).

#1 bloader會自動搜索當(dāng)前文件 或 當(dāng)前目錄下的<類名>.class.php文件,以及通過'_MODULES'常量定義的路徑,實例化類返回對象.
#2 可直接使用ld('類名')操作對象(見實例 1-1)
#3 bloader會在當(dāng)前作用域自動注冊一個以類名為變量名的變量'$類名'(見實例 1-2)
#4 bloader中使用ld函數(shù)訪問對象是全局范圍有效 (見實例 1-3)
#5 使用ld_new實例化多個不同的對象,而不注冊變量 (見實例 1-4)
#6 使用ld_unset注銷已經(jīng)實例化的對象 (見實例 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
復(fù)制代碼 代碼如下:

<?php
///define('_MODULES',dirname( __FILE__ ).'/class'); ///可選配置,在指定目錄下查找類文件,以便于實例化
ld('c1',array('1','2'))->a1="a1"; ///參數(shù)2為構(gòu)造函數(shù)的參數(shù)
ld('c1')->a2='a2';
ld('c1')->printt();

/**
show:
c1 Object
(
[a1] => a1
[a2] => a2
[a3] => Array
(
[0] => 1
[1] => 2
)
)
*/
?>

復(fù)制代碼 代碼如下:

<?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
復(fù)制代碼 代碼如下:

<?php
...
ld('users');
//自動注冊了$users變量
$users->method();
....
?>

實例 1-3
復(fù)制代碼 代碼如下:

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

實例 1-4
復(fù)制代碼 代碼如下:

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

實例 1-5
復(fù)制代碼 代碼如下:

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

奉上主要代碼供拍磚

復(fù)制代碼 代碼如下:

...
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;
}
...

相關(guān)文章

  • 教你在PHPStorm中配置Xdebug

    教你在PHPStorm中配置Xdebug

    這篇文章主要介紹了教你在PHPStorm中配置Xdebug的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • ThinkPHP基于think-queue的隊列插件實現(xiàn)消息推送

    ThinkPHP基于think-queue的隊列插件實現(xiàn)消息推送

    think-queue是ThinkPHP官方提供的一個消息隊列服務(wù),是專門支持隊列服務(wù)的擴展包。think-queue消息隊列適用于大并發(fā)或返回結(jié)果時間比較長且需要批量操作的第三方接口,可用于短信發(fā)送、郵件發(fā)送、APP推送。
    2022-12-12
  • PHP網(wǎng)頁緩存技術(shù)優(yōu)點及代碼實例

    PHP網(wǎng)頁緩存技術(shù)優(yōu)點及代碼實例

    這篇文章主要介紹了PHP網(wǎng)頁緩存技術(shù)優(yōu)點及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • PHP漏洞全解(詳細介紹)

    PHP漏洞全解(詳細介紹)

    針對PHP的網(wǎng)站主要存在下面幾種攻擊方式,這里介紹下,大家在書寫php代碼的時候一定要注意下
    2012-11-11
  • PHP反射機制原理與用法詳解

    PHP反射機制原理與用法詳解

    這篇文章主要介紹了PHP反射機制原理與用法,結(jié)合實例形式分析了php反射機制的原理、用法及相關(guān)注意事項,需要的朋友可以參考下
    2017-02-02
  • php通過header增加Key、Sign和Timestamp實現(xiàn)鑒權(quán)機制的流程步驟

    php通過header增加Key、Sign和Timestamp實現(xiàn)鑒權(quán)機制的流程步驟

    在現(xiàn)代Web應(yīng)用程序中,鑒權(quán)是確保只有合法用戶能夠訪問資源的關(guān)鍵部分,在PHP中,你可以通過在HTTP請求的Header中添加Key、Sign和Timestamp來實現(xiàn)鑒權(quán)機制,需要的朋友可以參考下
    2023-10-10
  • 基于PHP+Ajax實現(xiàn)表單驗證的詳解

    基于PHP+Ajax實現(xiàn)表單驗證的詳解

    本篇文章是對PHP+Ajax實現(xiàn)表單驗證的代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php 字符轉(zhuǎn)義 注意事項

    php 字符轉(zhuǎn)義 注意事項

    今天碰到一個處理文件特殊字符的事情,再次注意到這個問題
    2009-05-05
  • 修復(fù)ShopNC使用QQ 互聯(lián)時提示100010 錯誤

    修復(fù)ShopNC使用QQ 互聯(lián)時提示100010 錯誤

    本文給大家介紹了修復(fù)ShopNC使用QQ 互聯(lián)時提示100010 錯誤的方法,以及QQ互聯(lián)里面的處理方法,有需要的小伙伴可以參考下
    2015-11-11
  • 理解php Hash函數(shù),增強密碼安全

    理解php Hash函數(shù),增強密碼安全

    服務(wù)器和數(shù)據(jù)庫的資料偶爾會被竊取,因此需要保證發(fā)生這種情況時一些重要的用戶數(shù)據(jù),比如密碼,是別人無法獲取的。這里我們將要討論Hash的原理,以及它是如何保護Web應(yīng)用程序中的密碼安全的。
    2011-02-02

最新評論