PHP カーネルの研究: HASH テーブルと変数_PHP チュートリアル
Jul 14, 2016 am 10:08 AM
hash
php
カーネル
変数
そして
存在する
属性
絶え間ない
データ
研究
親切
表面
PHPハッシュテーブル
PHP では、変数、定数、クラス、属性に関係なく、すべてのデータはハッシュ テーブルを使用して実装されます。
まず HASH テーブルについて話しましょう
typedef 構造体バケット {
ulong h;
uint nKeyLength; //キーの長さ char arKey[1] /* 最後の要素である必要があります */
} バケツ
typedef struct _hashtable {
uint nTableSize //ハッシュテーブルのサイズ
uint nTableMask;//nTableSize-1 と等しい
uint nNumOfElements;//オブジェクトの数
ulong nNextFreeElement //次の空の要素の位置を指す nTableSize+1
Bucket *pInternalPointer; /* 要素の走査に使用されます */// 現在の走査されたポインターを保存します
Bucket *pListHead;//ヘッド要素ポインタ
Bucket *pListTail;//末尾要素ポインタ
Bucket **arBuckets;//ストレージのハッシュ配列データ
dtor_func_t pDestructor;//デストラクターに似ています
zend_boolpersistent;//PHP はメモリを均一に管理するのか、それとも通常の malloc を使用するのか
unsigned char nApplyCount;//現在のハッシュ バケットがアクセスされた回数、無限再帰ループを防ぐためにデータが走査されたかどうか
zend_bool bApplyProtection;
#if ZEND_DEBUG バケツ**tmp;
if (nSize >= 0x80000000) { //HASH テーブルのサイズが 0x8 より大きい場合、0x8 に初期化されます
/* オーバーフローを防ぐ */
ht->nTableSize = 0x80000000;
} その他 { ht->nTableMask = ht->nTableSize - 1;
ht->pDestructor = pDestructor;//HashTable が追加、削除、または変更されたときに呼び出される関数ポインター ht->pListHead = NULL;
ht->pListTail = NULL;
ht->nNumOfElements = 0;
ht->nNextFreeElement = 0;
ht->pInternalPointer = NULL;
ht->persistent =persistent; //persistent が TRUE の場合は、オペレーティング システム独自のメモリ割り当て関数を使用してバケットにメモリを割り当てます。それ以外の場合は、PHP のメモリ割り当て関数を使用します ht->bApplyProtection = 1;
if (persistent) { //オペレーティング システムは、独自のメモリ割り当てメソッドを使用してメモリを割り当てます。calloc がメモリを割り当てた後、メモリは自動的に 0 に初期化されます。
tmp = (バケット **) calloc(ht->nTableSize, sizeof(バケット *));
if (!tmp) {
失敗を返す
}
ht->arBuckets = tmp;
} else {//PHP のメモリ管理メカニズムを使用してメモリを割り当てます if (tmp) {
ht->arBuckets = tmp;
} zval uninitialized_zval
zval *uninitialized_zval_ptr;
zend_ptr_stack arg_types_stack;
zend_op **opline_ptr;
zend_class_entry *named_scope; /* 呼び出し元クラスのスコープ */
zval *これ;
zend_error_handling_t エラー処理
zend_class_entry *例外クラス
/* タイムアウトのサポート */
int タイムアウト_秒
int ラムダ数
ハッシュテーブル *ini_directives;
ハッシュテーブル *modified_ini_directives;
zend_objects_store オブジェクトストア
zval *例外、*prev_例外
zend_op *opline_before_例外
zend_op 例外_op[3];
zend_property_info std_property_info;
void *saved_fpu_cw;
まずはここで簡単に見てみましょう。後で使用するときに詳しく説明します
PHP の最も基本的な単位は変数です:
PHP で変数を定義するのはこれ以上に簡単です
として
<?php
$a=1;
?>ALLOC_ZVAL(zv); //最終的には (p) = (type *) emalloc(sizeof(type)) と等しくなります
INIT_PZVAL(zv);
INIT_PZVAL は で定義されています
(z)->is_ref__gc = 0;
それでは、zvalとは何ですか
; Int len // ここに長さを返します
}
ハッシュテーブル*ht;
zend_object_value obj // これはオブジェクトです ;
} zvalue_value の形式で他の変数から参照されます。
zend_uchar type; //データ型 これが、PHP の型指定が弱い理由です まだ十分に理解できない場合は...試してみましょう...C を使用して PHP 変数を作成します
ここでは拡張機能が必要です。PHP が C 拡張モジュールを使用する場合は、ここでは詳しく説明しません
キーコード
PHP_FUNCTION(test_siren){
zval *value;
char *s="PHP 変数を作成する";
値=(zval*)malloc(sizeof(zval));
memset(値,0,サイズ(値));
value->is_ref__gc=0; //非参照変数
Value->refcount__gc=1;//引用数 自分のみ
value->type=IS_STRING;// 型は文字列です
value->value.str.val=s;//value
value->value.str.len=strlen(s);//長さ
ZEND_SET_SYMBOL(EG(active_symbol_table),"a",value);
} PHPではこうする
<?php
テストサイレン(1);
エコー $a このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

人気の記事
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

人気の記事
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック
Gmailメールのログイン入り口はどこですか?
7141
9


Java チュートリアル
1534
14


Laravel チュートリアル
1257
25


PHP チュートリアル
1205
29


CakePHP チュートリアル
1155
46



Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法
