程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php變量的研究

php變量的研究

編輯:PHP綜合

php變量的研究

每種編程語言共有的一個特性是存儲和取回信息; php也不例外. 雖然許多語言要求所有的變量都要在使用之前被定義, 並且它們的類型信息是固定的, 然而php允許程序員在使用的時候創建變量, 並且可以存儲任意類型語言能夠表達的信息. 並且還可以在需要的時候自動的轉換變量類型.

因為你已經使用過用戶空間的php, 因此你應該知道這個概念是"弱類型". 本章, 你將看到這些信息在php的父語言----c(C的類型是嚴格的)中是怎樣編碼的.

當然, 數據的編碼只是一半工作. 為了保持對所有這些信息片的跟蹤, 每個變量還需要一個標簽和一個容器. 從用戶空間角度來看, 你可以把它們看做是變量名和作用域的概念.

數據類型

php中的數據存儲單位是zval, 也稱作Zend Value. 它是一個只有4個成員的結構體, 在Zend/zend.h中定義, 格式如下:

typedef struct _zval_struct {  
    zval_value  value;  
    zend_uint   refcount;  
    zend_uchar  type;  
    zend_uchar  is_ref;  
} zval;

我們可以憑直覺猜想到這些成員中多數的基礎存儲類型: unsigned integer的refcount, unsigned character的type和is_ref. 而value成員實際上是一個定義為union的結構, 在php5中, 它定義如下:

typedef union _zvalue_value {  
    long                    lval;  
    double              dval;  
    struct {  
        char        *val;  
        int     len;  
    }                   str;  
    HashTable           *ht;  
    zend_object_value       obj;  
} zvalue_value;

union允許Zend使用一個單一的, 統一的結構來將許多不同類型的數據存儲到一個php變量中.

zend當前定義了下表列出的8種數據類型:

類型值

目的

IS_NULL

這個類型自動的賦值給未初始化的變量,直到它第一次被使用.也可以在用戶空間使用內建的NULL常量進行顯式的賦值.這個變量類型提供了一種特殊的"沒有數據"的類型,它和布爾的FALSE以及整型的0有所不同.

IS_BOOL

布爾變量可以有兩種可能狀態中的一種, TRUE/FALSE.用戶空間控制結構if/while/ternary/for等中間的條件表達式在評估時都會隱式的轉換為布爾類型.

IS_DOUBLE

浮點數據類型,使用主機系統的signed double數據類型.浮點數並不是以精確的精度存儲的;而是用一個公式表示值的小數部分的有限精度(譯注:浮點數被表示為3部分:符號,尾數--小數部分,指數.浮點數的值 =符號 *尾數 * 2 ^指數----來自BSD Library Functions Manual: float(3)).這種計數法允許計算機存儲很大范圍的值(正數或負數):用8字節就可以表示2.225*10^(-308)到1.798*10^(308)范圍內的數字.不幸的是它評估的數字實際的十進制並不能總是像二進制分數一樣干淨的存儲.例如,十進制表達式0.5轉換為二進制的精確值是0.1,然而十進制的0.8轉換為二進制則是無限循環的0.1100110011...,當它轉換回十進制時,因為無法存儲被丟棄的二進制位將無法恢復.類似的可以想一下將1/3轉換為十進制的0.333333,兩個值非常相近,但是它不精確,因為3 * 0.333333並不等於1.0.這個不精確常常會在計算機上處理浮點數時讓人迷惑.(這些范圍限制通常是基於32位平台的;不同的系統范圍可能不同)

IS_STRING

php中最常見的數據類型是字符串,它的存儲方式符合有經驗的C程序員的預期.分配一塊足夠大去保存字符串中所有的字節/字符的內存,並將指向該字符串的指針保存在宿主zval中.

值得注意的是php字符串的長度總是顯式的在zval結構中指出.這就允許字符串包含NULL字節而不被截斷.關於php字符串的這一方面,我們往後稱為"二進制安全"因為這樣做使得它可以安全的包含任意類型的二進制數據.

需要注意的是為一個php字符串分配的內存總量總是最小化的:長度加1.最後的一個字節存放終止的NULL字符,因此不關心二進制安全的函數可以直接傳遞字符串指針.

IS_ARRAY

數組是一種特殊目的的變量,它唯一的功能就是組織其他變量.不像C中的數組概念, php的數組並不是單一類型數據的向量(比如zval arrayofzvals[];).實際上, php的數組是一個復雜的數據桶集合,它的內部是一個HashTable.每個HashTable元素(桶)包含兩個相應的信息片:標簽和數據.在php數組的應用場景中,標簽就是關聯數組的key或數值下表,數據就是key指向的變量(zval)

IS_OBJECT

對象擁有數組的多元素數據存儲,此外還增加了方法,訪問修飾符,作用域常量,特殊的事件處理器.作為一個擴展開發者,構建在php4和php5中等價的面向對象代碼是一個很大的挑戰,因為在Zend引擎1(php4)和Zend引擎2(php5)之間,內部的對象模型有非常大的變更.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved