zend によって拡張された PHP オブジェクトの自動ロード ツール api_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:30:39
オリジナル
776 人が閲覧しました

spl の自動ロード関数と同様に、bloader は PHP オブジェクトの自動ロード ツールですが、よりシンプルで効率的であり、構成はより柔軟です。

bloader は、一般的に使用される自動ロード関数 ld と 2 つの補助関数 ld_new (

#1 blloader は、現在のファイルまたは現在のディレクトリ内の .class.php ファイルと、'_MODULES' 定数で定義されたパスを自動的に検索します。クラスをインスタンス化してオブジェクトを返します。
#2 ld('class name') を直接使用してオブジェクトを操作できます (例 1-1 を参照)
#3 blloader は変数 '$class name' をクラスに自動的に登録します。現在のスコープ内の名前 (例 1-2 を参照)
#4 blloader で ld 関数を使用してオブジェクトにアクセスすることはグローバルに有効です (例 1-3 を参照)
#5 ld_new を使用して、変数を登録せずに複数の異なるオブジェクトをインスタンス化します (例 1-3 を参照)例 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

コードをコピー コードは次のとおりです:

///define('_MODULES',dirname( __FILE__ ).'/class'); ///簡単にインスタンス化するために、指定されたディレクトリでクラス ファイルを検索します
ld('c1',array( '1','2'))->a1="a1"; ///パラメータ 2 はコンストラクタのパラメータです
ld('c1')->a2=' a2';
ld('c1' )->printt();

/**
表示:
c1 オブジェクト
(
[a1] => a1
[a2] => a2
[a3] => 配列
(
[0] => 1
[1] => 2
)
)
*/


コードは次のとおりです: /**
例:
./class/c1.class.php:
* /
クラス c1
{
public $a2='abc';
public function __construct($ls)
{
$this->a3=$ls;
}
パブリック関数 printt()
{
print_r(ld('c1')); /**グローバル属性を使用する*/
}
?>

例 1-2



コードをコピー

コードは次のとおりです:


... ld('users') //$users 変数は自動的に登録されます $users->method(); ....
> 例 1-3



コードは次のとおりです:


ld('ユーザー');
printt(); // オブジェクトを印刷します...
関数 printt()
}
?> =ld_new('ユーザー'); users_2=ld_new('users'); ... ?>
例 1-5



コードは次のとおりです:


< ');
unset_users();
function unset_users()
{
ld_unset('users');
?>

コード コードは次のとおりです:

...
PHP_FUNCTION(ld)
{
char *obj_name;
イントスレン;
zval **var,*para = NULL;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS)
{
zend_error(E_ERROR, "パラメータが失敗しました。");
}
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;
イントスレン;
zval *para = NULL;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|z", &obj_name,&slen,¶) != SUCCESS)
{
zend_error(E_ERROR, "パラメータが失敗しました。");
}
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;
イントスレン;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &obj_name,&slen) != SUCCESS)
{
zend_error(E_ERROR, "パラメータが失敗しました。");
}
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 *コンストラクター;
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 (コンストラクター != 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);
}
オブジェクトを返します。
}

static int ld_autoload_path(char *class_name TSRMLS_DC)
{
char *ext_name = ".class.php";
char *ファイルパス;
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) 成功を返します。
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);
}
}
失敗を返します。
}
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 ダミー = 1;
if (!file_handle.opened_pa​​th) file_handle.opened_pa​​th = estrndup(file_path, file_path_len);
if (zend_hash_add(&EG(include_files), file_handle.opened_pa​​th, strlen(file_handle.opened_pa​​th)+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(例外)) if (EG(return_value_ptr_ptr))
zval_ptr_dtor(EG(return_value_ptr_ptr));
}
成功を返します。
}
失敗を返します。
}
...

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/323138.html技術記事 spl の自動ロード機能に似ていますが、bloader は php オブジェクトの自動ロード ツールですが、より高機能で、構成もより活発です。 blloader は、常用の autoload 関数と 2 つの補助関数を提供します...

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!