<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • PHP變量和數(shù)據(jù)類型

            編程語(yǔ)言可以分為三大類

            創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的蘆溪網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

            1. 靜態(tài)類型語(yǔ)言,比如:C/Java等,在靜態(tài)語(yǔ)言類型中,類型的檢查是在編譯期(compile-time)確定的。

            2. 動(dòng)態(tài)語(yǔ)言類型,比如:PHP,python等各種腳本語(yǔ)言,這類語(yǔ)言中的類型是在運(yùn)行時(shí)確定的。

            3. 無(wú)類型語(yǔ)言,比如:匯編語(yǔ)言,匯編語(yǔ)言操作的是底層存儲(chǔ),他們對(duì)類型毫無(wú)感知。

             

            一、變量的結(jié)構(gòu)和類型

            1)變量的存儲(chǔ)結(jié)構(gòu)

            在官方的PHP實(shí)現(xiàn)內(nèi)部,所有變量使用同一種數(shù)據(jù)結(jié)構(gòu)(zval)來(lái)保存。 它不僅僅包含變量的值,也包含變量的類型。

            在PHP中,存在8種變量類型,可以分為三類:

            a. 標(biāo)量類型: boolean、integer、float(double)、string

            b. 復(fù)合類型: array、object

            c. 特殊類型: resource、NULL

            變量存儲(chǔ)結(jié)構(gòu)如下:

            struct _zval_struct {
                zvalue_value value;     /* 存儲(chǔ)變量的值 是個(gè)聯(lián)合體*/
                zend_uint refcount__gc;    /*表示引用計(jì)數(shù) 默認(rèn)1*/
                zend_uchar type;    /* 變量具體的類型 */
                zend_uchar is_ref__gc;    /*表示是否為引用 默認(rèn)0*/};

            type的值可以為: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE之一。

             

            2)變量的值存儲(chǔ)

            上面的value是個(gè)聯(lián)合體,正因?yàn)槭沁@樣,才能做到弱類型,聯(lián)合體如下:

            PHP變量和數(shù)據(jù)類型

            typedef union _zvalue_value {    long lval;    /*boolean integer*/
                double dval;    /*float*/
                struct {        char *val;        int len;
                } str;    /*String*/
                HashTable *ht;    /* Array */
                zend_object_value obj; /*Object*/} zvalue_value;

            PHP變量和數(shù)據(jù)類型

             

            3)哈希表(HashTable)

            a. 鍵(key):用于操作數(shù)據(jù)的標(biāo)示,例如PHP數(shù)組中的索引,或者字符串鍵等等。

            b. 槽(slot/bucket):哈希表中用于保存數(shù)據(jù)的一個(gè)單元,也就是數(shù)據(jù)真正存放的容器。

            c. 哈希函數(shù)(hash function):將key映射(map)到數(shù)據(jù)應(yīng)該存放的slot所在位置的函數(shù)。

            d. 哈希沖突(hash collision):哈希函數(shù)將兩個(gè)不同的key映射到同一個(gè)索引的情況。

             

            4)PHP的哈希實(shí)現(xiàn)

            PHP的大部分的語(yǔ)言特性都是基于哈希表實(shí)現(xiàn)的, 例如:變量的作用域、函數(shù)表、類的屬性、方法等,Zend引擎內(nèi)部的很多數(shù)據(jù)都是保存在哈希表中的。

            PHP中的哈希表是使用拉鏈法來(lái)解決沖突的,Zend為了保存數(shù)據(jù)之間的關(guān)系使用了雙向鏈表來(lái)鏈接元素。

            拉鏈法如下圖所示:

            圖中,”John Smith”和”Sandra Dee” 通過(guò)哈希函數(shù)都指向了152 這個(gè)索引,該索引又指向了一個(gè)鏈表, 在鏈表中依次存儲(chǔ)了這兩個(gè)字符串。

            Zend引擎哈希表結(jié)構(gòu)和關(guān)系如下:

            a. Bucket結(jié)構(gòu)體維護(hù)了兩個(gè)雙向鏈表,pNext和pLast指針?lè)謩e指向本槽位所在的鏈表的關(guān)系。

            b. 而pListNext和pListLast指針指向的則是整個(gè)哈希表所有的數(shù)據(jù)之間的鏈接關(guān)系。

            c. HashTable結(jié)構(gòu)體中的pListHead和pListTail則維護(hù)整個(gè)哈希表的頭元素指針和最后一個(gè)元素的指針。

             

            二、常量

            PHP內(nèi)核會(huì)在詞法解析時(shí)將這些常量的內(nèi)容賦值進(jìn)行替換,而不是在運(yùn)行時(shí)進(jìn)行分析。

            1)常量的存儲(chǔ)結(jié)構(gòu)

            常量是在變量的zval結(jié)構(gòu)的基礎(chǔ)上添加了一額外的元素。

            PHP變量和數(shù)據(jù)類型

            typedef struct _zend_constant {
                zval value; /* zval結(jié)構(gòu),PHP內(nèi)部變量的存儲(chǔ)結(jié)構(gòu),在第一小節(jié)有說(shuō)明 */
                int flags;  /* 常量的標(biāo)記如 CONST_PERSISTENT | CONST_CS | CONST_CT_SUBST*/
                char *name; /* 常量名稱 */
                uint name_len;  
                int module_number;  /* 模塊號(hào) */} zend_constant;

            PHP變量和數(shù)據(jù)類型

            1. CONST_CS:常量大小寫(xiě)敏感

            2. CONST_PERSISTENT:常量需要持久化;如果是非持久常量,會(huì)在RSHUTDOWN階段就將該常量釋放,否則只會(huì)在MSHUTDOWN階段將內(nèi)存釋放。用戶定義的常量都是非持久化的,通常擴(kuò)展和內(nèi)核定義的常量會(huì)設(shè)置為持久化。

            3. CONST_CT_SUBST:Allow compile-time substitution(在編譯時(shí)可被替換)。在PHP內(nèi)核中這些常量包括:TRUE、FALSE、NULL、ZEND_THREAD_SAFE和ZEND_DEBUG_BUILD五個(gè)。

            PHP常量的定義過(guò)程如下:

            define('KFJ', 'Hello World');

             

            2)標(biāo)準(zhǔn)常量

            PHP內(nèi)置定義的常量,他們屬于標(biāo)準(zhǔn)常量。如錯(cuò)誤報(bào)告級(jí)別E_ALL, E_WARNING等。

            這些常量都是持久化常量。

             

            3)魔術(shù)常量

            PHP中有七個(gè)魔術(shù)常量,他們的值其實(shí)是變化的,它們的值隨著它們?cè)诖a中的位置改變而改變。 所以稱他們?yōu)槟g(shù)常量。

             

            三、預(yù)定義變量

            對(duì)于全部腳本而言,PHP 提供了大量的預(yù)定義變量。這些變量將所有的外部變量表示成內(nèi)建環(huán)境變量,并且將錯(cuò)誤信息表示成返回頭。

            $_GET,$_POST,$_SERVER,$_FILES等變量,會(huì)在PHP腳本運(yùn)行之前就將它們加入到HashTable數(shù)據(jù)類型的符號(hào)表中。

            由于都存儲(chǔ)在一個(gè)地方,所以在某個(gè)局部函數(shù)中使用類似于$GLOBALS變量這樣的預(yù)定義變量, 如果在此函數(shù)中有改變的它們的值的話,這些變量在其它局部函數(shù)調(diào)用時(shí)會(huì)發(fā)現(xiàn)也會(huì)同步變化。

             

            四、靜態(tài)變量

            通常意義上靜態(tài)變量是靜態(tài)分配的,他們的生命周期和程序的生命周期一樣, 只有在程序退出時(shí)(RSHUTDOWN)才結(jié)束期生命周期,這和局部變量相反,局部變量只有在函數(shù)執(zhí)行時(shí)才會(huì)存在。 通常,當(dāng)一個(gè)函數(shù)執(zhí)行完畢,它的局部變量的值就已經(jīng)不存在,而且變量所占據(jù)的內(nèi)存也被釋放。

            靜態(tài)變量可以分為3中:

            1)靜態(tài)全局變量:PHP中的全局變量(預(yù)定義變量等)也可以理解為靜態(tài)全局變量,因?yàn)槌敲鞔_unset釋放,在程序運(yùn)行過(guò)程中始終存在。

            2)靜態(tài)局部變量:也就是在函數(shù)內(nèi)定義的靜態(tài)變量,Zend為每個(gè)函數(shù)分配了一個(gè)私有的符號(hào)表(EG(active_op_array)->static_variables)來(lái)保存該函數(shù)的靜態(tài)變量。

            3)靜態(tài)成員變量:這是在類中定義的靜態(tài)變量,和實(shí)例變量相對(duì)應(yīng),靜態(tài)成員變量屬于類,不屬于某個(gè)實(shí)例,新航道托福所以可以在所有實(shí)例中共享。

            查看在線代碼:

            PHP變量和數(shù)據(jù)類型

            //靜態(tài)局部變量function static_function() {    static $i=0;    $i++;    print_r($i);
            }
            static_function();//1static_function();//2static_function();//3

            PHP變量和數(shù)據(jù)類型

            PHP變量和數(shù)據(jù)類型

            //靜態(tài)成員變量
            //Zend為每個(gè)函數(shù)分配了一個(gè)私有的符號(hào)表來(lái)保存該函數(shù)的靜態(tài)變量。class static_class {    public static $i=0;    public function get_static() {        return ++self::$i;
                }
            }$class1 = new static_class();$class2 = new static_class();print_r($class1->get_static());//1print_r($class2->get_static());//2

            PHP變量和數(shù)據(jù)類型

             

            五、類型提示的實(shí)現(xiàn)

            PHP5中引入了類型提示這個(gè)概念。在定義方法參數(shù)時(shí),同時(shí)定義參數(shù)的對(duì)象類型。

            下面的示例代碼就是類型提示,但是在引用的時(shí)候傳入1,就會(huì)報(bào)錯(cuò)。

            function prompt(Array $arr) {    print_r($arr);
            }
            prompt(1);

            類型提示的實(shí)現(xiàn)有2種:

            1)參數(shù)聲明時(shí)的類型提示,例如“$arr=[1,2];”

            2)函數(shù)或方法調(diào)用時(shí)的類型提示(上面的示例代碼)

             

            六、變量的生命周期

            在ZE進(jìn)行詞法和語(yǔ)法的分析之后,生成具體的opcode,這些opcode最終被execute函數(shù)解釋執(zhí)行。

            1)變量的聲明和賦值

            在使用一個(gè)變量時(shí),我們不需要聲明,也不需要初始化,直接對(duì)其賦值就可以使用。

            $a = 10;

            當(dāng)賦值的時(shí)候,zval結(jié)構(gòu)中的refcount_gc默認(rèn)為1,當(dāng)引用這個(gè)值的時(shí)候,會(huì)加1。

            $a = 10;$b = &$a;//$a和$b引用了同一個(gè)zval結(jié)構(gòu),refcount_gc變?yōu)?,is_ref_gc為1$c = $a;//$c新建了一個(gè)zvak結(jié)構(gòu),refcount_gc變?yōu)?為1

             

            2)變量的作用域

            變量按作用域類型分為:全局變量和局部變量。

            與JavaScript不同,得益于閉包的特性,JavaScript可以在函數(shù)中調(diào)用函數(shù)外的變量,而PHP不行。下面的代碼是錯(cuò)誤的:

            $bar = 'outter';function _global() {    print_r($bar);//這里會(huì)報(bào)錯(cuò)}
            _global();print_r($bar);//輸出為outter

            a. 全局變量會(huì)保存在symbol_table中, 也就是頂層作用域中的變量。

            b. 函數(shù)或者對(duì)象的方法在被調(diào)用時(shí)會(huì)創(chuàng)建active_symbol_table來(lái)保存局部變量。

            c. 函數(shù)中的靜態(tài)變量存放在私有的符號(hào)表(EG(active_op_array)->static_variables)中。所以不會(huì)在函數(shù)結(jié)束的時(shí)候銷毀。

             

            3)global

            global語(yǔ)句的作用是定義全局變量,也就是將變量放到symbol_table中。

            將上面的代碼修改一下,增加一個(gè)global聲明:

            PHP變量和數(shù)據(jù)類型

            $bar = 'outter';function _global() {    global $bar ;//添加global聲明
                $bar = 'inner';    print_r($bar);
            }
            _global();print_r($bar);//輸出inner

            PHP變量和數(shù)據(jù)類型

             

            七、數(shù)據(jù)類型轉(zhuǎn)換

            1)隱式類型轉(zhuǎn)換

            a. 直接的變量賦值操作

            b. 運(yùn)算式結(jié)果對(duì)變量的賦值操作

            PHP變量和數(shù)據(jù)類型

            $str = 33;    //integer 另外的float(double)類似var_dump('prase'.$str);$str = null;    //nullvar_dump('prase'.$str);$str = true;    //booleanvar_dump('prase'.$str);$str = array(1,2);    //arrayvar_dump('prase'.$str);$str = new static_class();    //object 調(diào)用靜態(tài)變量中的類var_dump('prase'.$str);

            PHP變量和數(shù)據(jù)類型

            a. 隱式轉(zhuǎn)換null的時(shí)候,最后輸出的是空

            b. boolean轉(zhuǎn)換成了0或1

            c. 雖然array最后輸出了,但最后還是報(bào)錯(cuò)。

            d. 而類是直接報(bào)錯(cuò),沒(méi)有輸出。

             

            2)顯示類型轉(zhuǎn)換

            PHP中允許的強(qiáng)制類型有:

            a. (int), (integer) 轉(zhuǎn)換為整型

            b. (bool), (boolean) 轉(zhuǎn)換為布爾類型

            c. (float), (double) 轉(zhuǎn)換為浮點(diǎn)類型

            d. (string) 轉(zhuǎn)換為字符串

            e. (array) 轉(zhuǎn)換為數(shù)組

            f. (object) 轉(zhuǎn)換為對(duì)象

            g. (unset) 轉(zhuǎn)換為NULL,這個(gè)還是第一次見(jiàn)到

            當(dāng)前標(biāo)題:PHP變量和數(shù)據(jù)類型
            本文路徑:http://www.jbt999.com/article20/jisjjo.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)做網(wǎng)站、商城網(wǎng)站Google

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            商城網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 免费全黄A片免费播放 | 香蕉伊人电影网站 | 影音先锋在线爱爱 | 亚洲热视频在线 | 婷婷精品免费久久 |