ホームページ >バックエンド開発 >PHPチュートリアル >PHPソースコード解析 - 弱い型変数の実装_PHPチュートリアル
PHP は、型指定が弱い動的スクリプト言語です。変数を宣言するとき、変数が保持するデータ型を指定する必要はありません。
例:
$var = 1;
$var = "変数";
$var = 1.00;
$var = 配列();
$var = 新しいオブジェクト()
;
$var = 1;
$var = "変数";
$var = 1.00;
$var = array();
$var = 新しいオブジェクト();
動的変数は実行時に変更でき、使用前に変数の型を宣言する必要はありません。
実際、PHP で宣言された変数は、ZE の zval 構造体に格納されます。
まず、Zend/zend.h を開いて zval の定義を確認します。
typedef struct _zval_struct zval;
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount__gc;
zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc;
};
typedef Union _zvalue_value {
長い lval; /* 長い値 */
double dval /* double 値 */
構造体{
char *val
整数
HashTable *ht; /* ハッシュ テーブルの値 */
zend_object_value オブジェクト
zvalue_value
typedef struct _zval_struct zval;
struct _zval_struct {
/* 変数情報 */
zvalue_value 値; /* 値 */
zend_uint refcount__gc;
zend_uchar タイプ; /* アクティブなタイプ */
zend_uchar is_ref__gc;
};
長い lval; /* 長い値 */
double dval; /* 倍精度の値 */
構造体{
char *val;
イントレン;
} str;
HashTable *ht; /* ハッシュ テーブルの値 */
zvalue_value;
Zend/zend_types.h:
typedef unsigned char zend_bool
typedef unsigned char zend_uchar
typedef unsigned int zend_uint;
typedef unsigned long zend_ulong
typedef unsigned short zend_ushort
typedef unsigned char zend_bool;
typedef unsigned char zend_uchar;
typedef unsigned int zend_uint;
typedef unsigned short zend_ushort;
上記のコードから、_zvalue_value が実際にデータを保存する重要な部分であることがわかります。 Union を使用した弱い型付き変数宣言
質問 2: Zend エンジンは、PHP 内のさまざまなデータ型をどのように識別して保存しますか?
_zval_struct.type は変数の実際の型を格納し、型に基づいて zvalue_value の値を取得する方法を選択できます。
型値リスト (Zend/zend.h):
#IS_NULL 0 を定義します
#IS_LONG 1 を定義します
#IS_DOUBLE 2 を定義します
#IS_BOOL 3 を定義します
#IS_ARRAY 4 を定義します
#IS_OBJECT 5 を定義します
#IS_STRING 6 を定義します
#IS_RESOURCE 7 を定義します
#IS_CONSTANT 8 を定義します
#IS_CONSTANT_ARRAY 9 を定義します
型値リスト (Zend/zend.h):
#IS_NULL 0 を定義します
#IS_LONG 1 を定義します
#IS_DOUBLE 2 を定義します
#IS_BOOL 3 を定義します
#IS_ARRAY 4 を定義します
#IS_OBJECT 5 を定義します
#IS_STRING 6 を定義します
#IS_RESOURCE 7 を定義します
#IS_CONSTANT 8 を定義します
#IS_CONSTANT_ARRAY 9 を定義します
簡単な例を見てみましょう: www.2cto.com
$a = 1;
//このとき、zval.type = IS_LONG の場合、zval.value は lval になります。
$a = 配列();
//このとき、zval.type = IS_ARRAY の場合、zval.value は
を取得します。
$a = 1;
//この時点では zval.type = IS_LONG なので、zval.value は lval.
を取得します。
$a = 配列();
//この時点では zval.type = IS_ARRAY なので、zval.value は ht.
を取得します。
これらの中で最も複雑で、サードパーティの拡張機能を開発するときによく必要になるのは、「リソース タイプ」です。
PHP では、PHP の組み込み変数タイプに属さない変数はすべてリソースとして扱われ、保存されます。
例: データベース ハンドル、オープン ファイル ハンドル、オープン ソケット ハンドル。
リソースタイプは、ZE が提供する API 関数を使用して登録する必要があります。リソース変数の宣言と使用方法については、別の記事で詳しく紹介します。
神様のブログより抜粋
http://www.bkjia.com/PHPjc/478520.html