PHP の変数は、弱い型付けの言語であるため、あらゆるデータ型を保存できます。ただし、PHP は C 言語で書かれており、各変数の型は固定されています (型変換を強制することはできますが、zend エンジンでは問題が発生する可能性があります)。 、それは、変数はどのような型を保存することができますか?
zend/zend.h ヘッダー ファイルには、次の構造があります:
typedef struct _zval_struct zval;typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; }str; HashTable *ht; zend_object_value obj;} zvalue_value ;struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref;};
zval 構造は、一般的に使用される PHP 変数をカーネルで表現する方法です。 zval 構造体には、次の 4 つのメンバー変数が表示されます。
zvalue_value value; //变量的值,PHP变量的值就保存在这里zend_uint refcount; //变量引用数,变量引用计算器zend_uchar type; //变量的类型zend_uchar is_ref; //变量是否被引用
zval 構造体の value メンバー変数は、zvalue_value 共用体です。 この共用体により、PHP は任意の構造体の型を維持できます 。 zvalue_value ユニオンのメンバー変数からわかるように、異なる型は異なるメンバー変数に保存されるため、PHP 変数には任意のデータ型を格納できます。たとえば、変数が整数型の場合は value の lval メンバー変数に保存され、変数の型が文字列の場合は value の str メンバー変数に保存されます。
もう 1 つの質問は、zend エンジンはこの変数に格納されている型をどのようにして知るのでしょうか? zval 構造体に type メンバー変数があることに気付きました。このメンバー変数は php 変数の型を保存するためのものです。
zend エンジンは 8 つの変数タイプを定義します。
#define IS_NULL 0#define IS_LONG 1#define IS_DOUBLE 2#define IS_STRING 3#define IS_ARRAY 4#define IS_OBJECT 5#define IS_BOOL 6#define IS_RESOURCE 7
各マクロ定義は、PHP 言語層のタイプに対応します。たとえば、zval の type メンバー変数が IS_STRING (zval.type==IS_STRING) に等しい場合、この変数の型は文字列型です。
著作権声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。