PHP カーネルの深い理解 (5) 変数とデータ型 - 変数の構造と型
元のリンク: http://www.orlion.ga/238/
型プログラミング言語は強い型と弱い型の2種類に分けられます。PHPは弱い型付け言語ですが、C言語は強い型付け言語です。公式の PHP 実装では、すべての変数が同じデータ構造 (zval) を使用して保存されます。この構造には、変数の値だけでなく、変数の型も含まれます。これは PHP の弱い型付けの中核です。
zval 構造体は弱い型付けをどのように実装しますか?
1. PHP 変数の型とストレージ構造
PHP は変数の宣言や使用時にデータ型を指定する必要はありませんが、PHP には型があり、PHP には 8 種類のデータ型があります。スカラー型: ブール、整数、浮動小数点 (倍精度) 文字列; 複合型: 配列、オブジェクト; 特殊型: リソース、NULL
C 言語は PHP Woolen クロスでどのように弱い型を実装しますか?
1. 変数の格納構造
変数の値は、以下に示すように zval 構造体に格納されます。 zval 構造体は Zend/zend.h ファイルで定義されており、その構造は次のとおりです:
typedef struct _zval_struct zval;...struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc;};
zval 構造体には 4 つのフィールドがあり、それらの意味は次のとおりです:
属性名 | 含义 | 默认值 |
refcount_gc | 表示引用计数 | 1 |
is_ref_gc | 表示是否为引用 | 0 |
value | 存储变量的值 | |
type | 变量具体的类型 |
PHP5 では、新しいガベージ コレクション メカニズムが導入されました。それ以前は、refcount と is_ref でした。
変数は別の構造体 zvalue_value に格納され、その値は以下の概要を参照してください。
2. 変数の型
zval 構造体の type フィールドは、弱い型指定を実装するための最も重要なフィールドです。 IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_OBJECT、IS_RESOURCE のいずれかになります。さらに、それらで定義されるタイプには、IS_CONSTANT および IS_CONSTANT_ARRAY が含まれます。
2. 変数値の格納
前述したように、値はzvalue_value 共用体では、構造体は次のように定義されます。
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj;} zvalue_value;
さまざまなタイプのデータは、変数値と対応する割り当てを格納するために異なるメソッドを使用します。メソッドは次のとおりです。
一般的なタイプ:
変数の種類 | マクロ | tr> | |||||||||||||||||
ブール値 | ZVAL_BOOL |
| tr>|||||||||||||||||
整数 | ZVAL_LONG | tr>||||||||||||||||||
float | ZVAL_DOUBLE | Z_TYPE_P(z )=IS_BOOL/LONG;Z_LVAL_P(z)=(b)!=0; | |||||||||||||||||
null | ZVAL_NULL | NULL 値の変数値を格納する必要はありません(zval).type を IS_NULZ_TYPE_P(z)=IS_NULL; | |||||||||||||||||
としてマークするだけです。 resource | ZVAL_RESOURCE | リソース タイプのストレージは、他の一般的なリソース タイプと変わりません。変数ですが、初期化とストレージの実装が異なりますZ_TYPE_P(z) = IS_RESOURCE = 1; |
字符串
字符串的类型标示和其他数据类型一样,不过在存储字符串时多了一个字符串长度的字段。
struct { char *val; int len;} str;
(存储字符串长度是因为字符串的操作十分频繁,有利于节省时间,是空间换时间的做法)
数组Array
数组是PHP中最常用也是最强大变量类型。数组的值存储在zvalue_value.ht字段中,它是一个HashTable类型的数据。PHP数组使用哈希表来存储关联数据。PHP的哈希表实现中使用了两个数据结构HashTable和Bucket。PHP所有的工作都是由哈希表实现。
对象Object
PHP的对象是一种复合型的数据,使用一种zend_object_value的结构体来存放,其定义如下
typedef struct _zend_object_value { zend_object_handle handle; // unsigned int?类型,EG(objects_store).object_buckets的索引 zend_object_handlers *handlers;} zend_object_value;
PHP的对象只有在运行时才会被创建,前面介绍了EG宏,这是一个全局结构体由于保存在运行时的数据。其中就包括了用来保存所有被创建的对象的对象池,EG(objects_store),而object对象值内容的zend_object_handle域就是当前对象在对象池中所在的索引,handlers字段则是将对象进行操作时的处理函数保存起来。
PHP的弱变量容器的实现方式是兼容并包的形式体现。

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

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