一、變數變數是最常見的資料型別應用形式,它由三個主要部分組成,變數名,變數值,變數型別,php 中的變數名於變數值分別對應的為:zval,zend_value,這兩個概念一定要區分開,php的變數的記憶體是通過引用計數進行管理的,而且php7中的引用計數轉移到了具體的 value結構中而不在是 zval,這是php與舊版本不同的乙個地方,變零之間的傳遞,賦值通常也針對 zend_value。php 中 通過 $ 符號定義乙個變數,在定義的同時可以進行初始化,在變數使用的不需要提前宣告,事實上普通變數定義的方式包含了兩步:變零定義、變數初始化,只定義而不初始化變數也是可以的。
例如:
$a;
$b = 1;
這段**在執行時會分配兩個 zval,也就是這裡定義了兩個變數,只不過$a 沒有值而已,相當於 unset() 了。
二、 變數型別
// file: zend_types.h
/* regular data types */
#define is_undef 0
#define is_null 1
#define is_false 2
#define is_true 3
#define is_logn 4
#define is_double 5
#define is_string 6
#define is_array 7
#define is_object 8
#define is_resocrce 9
#define is_reference 10
/* constant expressions */
#define is_constant 11
#define is_constant_ast 12
/* fake types */
#define is__is_bool 13
#define is_callable 14
/* internal types */
#define is__indirect 15
#define is_ptr 16
三、zval 定義 及 實現**在 zend目錄下 zend_types.h 中
struct _zval_struct
//value 聯合體
typedef union_zend_value zend_value;
u1 union v;
unint32_t type_info;
} u1
type_flags 代表的型別
#define is_type_constant // 常量型別
#define is_type_immutable // 可變型別
#define is_type_refcounted // 引用計數型別
#define is_type_collectable // 可以包含引用型別的型別,(比如陣列中 和物件裡迴圈引用)
#define is_type_refcounted // 複製的型別
三、簡單檢視zval,通過 gdb 除錯檢視定義乙個 zval.php 檔案,**如下:
<?php
$a = 2; // 整形
echo $a;
$b = 3.2; // 浮點型
echo $b;
$c = true; // bool
echo $c;
$arr = [1,2,3]; // 陣列
echo $arr;
1、b zend_echo_spec_cv_handler(在echo 打斷點)
2、可以看到 type = 4,對應的是整形,就去取 lval,可以看到這裡的記憶體位址是 0x7ffff7a14080
三、通過輸入 c 接著看 浮點型的結果,可以看到這裡的記憶體位址是 0x7ffff7a14090
四、這裡可以看到 type = 4,對應的就是 true
五、 這裡的type是7,所以去取出 value 中的 arr, 可以看到 arr 對應的結構體。
最後可以看到,上面取出 zval 的記憶體位址,每乙個相差10,對應 16進製制,也就是 16個位元組。
php7 變數處理機制修改
一 間接變數 屬性和方法引用都按照從左到右的順序進行解釋 foo bar baz interpreted as foo bar baz foo bar baz interpreted as foo bar baz foo bar baz interpreted as foo bar baz foo ...
遷移到php7,遷移PHP版本到PHP7
這篇文章主要介紹了遷移php版本到php7的方法,需要的朋友可以參考下 今天看到微博上說phpng也就是php7合併到master上了,大家都知道我是比較喜歡 最新版本的東西,看看有什麼特性,我就忍不住公升級去了,以前我的php版本是5.5.19,然後我就開始了。yum install git gi...
遷移到php7,遷移PHP版本到PHP7
遷移php版本到php7 今天看到微博上說phpng也就是php7合併到master上了,大家都知道我是比較喜歡 最新版本的東西,看看有什麼特性,我就忍不住公升級去了,以前我的php版本是5.5.19,然後我就開始了。如下 yum install git git clone 如下 單核 intel ...