標籤:整數 對象 zend 表結構 資料庫 不能 padding 串連 檔案
PHP是一門弱語言,也就說PHP的一個變數可以儲存任意類型的變數,PHP是用C語言實現的,而C語言是一個強型別的語言,每個變數都有固定的類型,不能隨意改變變數的類型(雖然可以通過強制類型轉換,可能會出問題)。在zend引擎中的實現:
引用的是PHP 5的源碼:
開啟zend.h 會發現定義了如下的結構體:
typedef struct _zval_struct zval;
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;
zend_ast *ast;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
其中 zval 就是PHP的變數的底層實現,zval是用結構體來實現的。
在zvalue_value中:
lval 是long類型資料,即是C語言中long。
dval 是double類型資料,即是C語言中double。
str 是一個結構體,成員變數var是char類型的指標,指向一個字元數組的首地址,為了資料安全,用len告訴系統要取多長的資料。
ht 是一個hash表結構,是為了儲存數組;
obj 是為了儲存物件類型;其中zend_object_value 就是zend為了儲存物件而定義的結構體。
ast 是PHP 5.6以後才有的,是為了儲存常量;
在_zval_struct中,
value 即是上述所說的zvalue_value,也就是儲存的資料;
refcount__gc 即是變數的引用數,變數引用計算機。
type 變數的類型,為了儲存當前所儲存的資料,是哪一個類型的資料;常用類型如下所示:
#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
is_ref__gc 變數是否被引用。
對變數類型的解析:
IS_NULL |
0 |
空 |
IS_LONG |
1 |
long類型變數 |
IS_DOUBLE |
2 |
double類型變數 |
IS_BOOL |
3 |
布爾變數 |
IS_ARRAY |
4 |
數組 |
IS_OBJECT |
5 |
對象 |
IS_STRING |
6 |
字串 |
IS_RESOURCE |
7 |
資源類型變數 |
關於資源類型的變數:資源類型是一種特殊的變數,儲存了到外部資源的一個引用。比如資料庫的串連,開啟檔案,圖形畫布地區;
資源類型本質上儲存是一個整數,也就是resource ID ,zend可以根據這個ID去找到最終所需要的資料;
例如:$file_source = fopen(“a.txt”,”r”);
可以用is_resource()函數測定一個變數是否是資源,函數get_resource_type()則返回該資源的類型。
關於變數的賦值會有 寫時複製機制。
PHP變數的實現原理【轉】