ホームページ バックエンド開発 PHPチュートリアル zend によって拡張された PHP オブジェクトの自動ロード ツール api_PHP チュートリアル

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

Jul 21, 2016 pm 03:30 PM
api autoload php spl zend 関数 物体 道具 拡大する

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 つの補助関数を提供します...

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 PHP関数引数と配列の開梱で...(SPLAT)演算子の目的と使用について説明してください。 Apr 06, 2025 am 12:07 AM

PHPの...(SPLAT)演算子は、機能パラメーターと配列を開梱するために使用され、コードのシンプルさと効率を向上させます。 1)関数パラメーター解放:アレイ要素をパラメーターとして関数に渡します。 2)配列の開梱:アレイを別の配列または関数パラメーターに解除します。

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

グラデーションの背景を持つカードとクーポンのレイアウトに対するギャップ効果を達成する方法は? グラデーションの背景を持つカードとクーポンのレイアウトに対するギャップ効果を達成する方法は? Apr 05, 2025 am 07:48 AM

カードクーポンレイアウトのギャップ効果を実現します。カードクーポンレイアウトを設計するとき、特に背景が勾配である場合、カードクーポンにギャップを追加する必要があることがよくあります...

H5ページの生産には継続的なメンテナンスが必要ですか? H5ページの生産には継続的なメンテナンスが必要ですか? Apr 05, 2025 pm 11:27 PM

H5ページは、コードの脆弱性、ブラウザー互換性、パフォーマンスの最適化、セキュリティの更新、ユーザーエクスペリエンスの改善などの要因のため、継続的に維持する必要があります。効果的なメンテナンス方法には、完全なテストシステムの確立、バージョン制御ツールの使用、定期的にページのパフォーマンスの監視、ユーザーフィードバックの収集、メンテナンス計画の策定が含まれます。

H5ページの生産用の材料を入手する場所 H5ページの生産用の材料を入手する場所 Apr 05, 2025 pm 11:33 PM

H5ページ資料の主なソースは次のとおりです。1。プロの素材Webサイト(有料、高品質、明確な著作権)。 2。自家製の材料(高いユニーク性、しかし時間がかかる); 3。オープンソースの材料ライブラリ(無料、慎重にスクリーニングする必要があります); 4。写真/ビデオWebサイト(著作権確認が必要です)。さらに、統一された材料スタイル、サイズの適応、圧縮処理、著作権保護は、注意が必要な重要なポイントです。

ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? Apr 05, 2025 pm 10:18 PM

なぜマイナスマージンが場合によっては有効にならないのですか?プログラミング中、CSSの負のマージン(負...

See all articles