ホームページ  >  記事  >  php教程  >  PHP グローバル変数: PHP ソースコード分析 - 弱い型変数の実装

PHP グローバル変数: PHP ソースコード分析 - 弱い型変数の実装

WBOY
WBOYオリジナル
2016-06-21 08:50:341362ブラウズ

PHP は、弱く型付けされた動的言語スクリプトです。変数を宣言するとき、変数が保持するデータ型を指定する必要はありません。
例:
$var = 1;
$var = "variable";
$var = 1.00;
$var = array();
$var = new Object();
動的変数は実行時に変更でき、使用前に変数の型を宣言する必要はありません。
それでは、質問 1: Zend エンジンはこの弱い型を C でどのように実装するのでしょうか?
実際、PHPで宣言した変数はZEではzvalという構造体に格納されます。
まず、Zend/zend.h を開いて zval の定義を確認します。
typedef struct _zval_struct zval;
struct _zval_struct {
/* 変数情報 */
zvalue_value value; * /
zend_uint refcount__gc;
zend_uchar type; /* アクティブな型 */
zend_uchar is_ref__gc;
};
typedef Union _zvalue_value {
long lval; /* long lval;
double dval; /* double 値 */
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} 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;
上記のコードから、_zvalue_value が実際にデータを保存するための重要な部分であることがわかります。弱い型指定の変数宣言は共用体を通じて実装されています
質問 2: Zend エンジンはどのようにして PHP で複数のデータ型を識別し、保存しますか?
_zval_struct.type は変数の実際の型を格納し、その型に基づいて zvalue_value の値を取得する方法を選択できます。
型値リスト (Zend/zend.h):
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9
簡単な例を見てみましょう:
$a = 1;
//この時点では zval.type = IS_LONG なので、zval.value は lval を取得します。
$a = array();
//この時点では zval. type = IS_ARRAY の場合、zval.value は ht を取得します。
最も複雑なもので、サードパーティの拡張機能の開発でよく使用されるのは「リソース タイプ」です。
PHP では、以下に属さないものはすべてリソース タイプとなります。 PHP の組み込み変数タイプの変数はリソースとして保存されます。 この記事へのリンク http://www.cxybl.com/html/wlbc/Php/20121213/34971.html



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