一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

第十五節(jié)--Zend引擎的發(fā)展

/*
+-------------------------------------------------------------------------------+
| = 本文為Haohappy讀<<Core php Programming>> 
| = 中Classes and Objects一章的筆記 
| = 翻譯為主+個(gè)人心得 
| = 為避免可能發(fā)生的不必要的麻煩請(qǐng)勿轉(zhuǎn)載,謝謝 
| = 歡迎批評(píng)指正,希望和所有php愛(ài)好者共同進(jìn)步! 
| = php5研究中心: http://blog.csdn.NET/haohappy2004
+-------------------------------------------------------------------------------+
*/
第十五節(jié)--Zend引擎的發(fā)展
本章的最后一節(jié),Zeev討論了Zend引擎帶來(lái)的對(duì)象模型,特別提到它與php的前幾個(gè)版本中的模型有什么不同.
當(dāng)1997年夏天,我們開(kāi)發(fā)出php3, 我們沒(méi)有計(jì)劃要使php具備面向?qū)ο蟮哪芰? 當(dāng)時(shí)沒(méi)有任何與類(lèi)和對(duì)象有關(guān)的想法. php3是一個(gè)純粹面向過(guò)程的語(yǔ)言. 但是,在1997.8.27的晚上php3 alpha版中增加了對(duì)類(lèi)的支持. 增加一個(gè)新特性給php,當(dāng)時(shí)僅需要極少的討論,因?yàn)楫?dāng)時(shí)探索php的人太少. 于是從1997年八月起, php邁出了走向面向?qū)ο缶幊陶Z(yǔ)言的第一步.
確實(shí),這只是第一步. 因?yàn)樵谶@個(gè)設(shè)計(jì)中只有極少的相關(guān)的想法,對(duì)于對(duì)象的支持不夠強(qiáng)大. 這個(gè)版本中使用對(duì)象僅是訪問(wèn)數(shù)組的一個(gè)很酷的方法而已. 取代使用$foo[“bar”],你可以使用看起來(lái)更漂亮的$foo->bar. 面向?qū)ο蠓椒ǖ闹饕膬?yōu)勢(shì)是通過(guò)成員函數(shù)或方法來(lái)儲(chǔ)存功能. 例子6.18中顯示了一個(gè)典型的代碼塊. 但是它和例6.19中的做法其實(shí)并沒(méi)有太大不同.
Listing 6.18 php 3 object-oriented programming php3中的面向?qū)ο缶幊?
復(fù)制代碼 代碼如下:<?php  
   class Example  
   {  
       var $value = "some value";  
       function PrintValue()  
       {  
           print $this->value;  
       }  
   }  
   $obj = new Example();  
   $obj->PrintValue();  
?>  Listing 6.19 php 3 structural programming phpphp3中的結(jié)構(gòu)化編程
復(fù)制代碼 代碼如下:<?php  
   function PrintValue($arr)  
   {  
       print $arr["value"];  
   }  
   function CreateExample()  
   {  
       $arr["value"] = "some value";  
       $arr["PrintValue"] = "PrintValue";  
       return $arr;  
   }  
   $arr = CreateExample();  
   //Use php's indirect reference  
   $arr["PrintValue"]($arr);  
?>  以上我們?cè)陬?lèi)中寫(xiě)上兩行代碼,或者顯示地傳遞數(shù)組給函數(shù). 但考慮到php3中這兩種選擇并沒(méi)有任何不同,我們?nèi)匀豢梢詢(xún)H把對(duì)象模型當(dāng)成一種”語(yǔ)法上的粉飾”來(lái)訪問(wèn)數(shù)組. 
想要用php來(lái)進(jìn)行面向?qū)ο箝_(kāi)發(fā)的人們,特別是想使用設(shè)計(jì)模式的人,很快就發(fā)現(xiàn)他們碰壁了. 幸運(yùn)地,當(dāng)時(shí)(php3時(shí)代)沒(méi)有太多人想用php來(lái)進(jìn)行面向?qū)ο箝_(kāi)發(fā).
php4改變了這種情況. 新的版本帶來(lái)了引用(reference)的概念, 它允許php的不同標(biāo)識(shí)符指向內(nèi)存中的同一個(gè)地址. 這意味著你可以使用兩個(gè)或更多的名稱(chēng)來(lái)給同一個(gè)變量命名,就像例6.20那樣.
Listing 6.20 php 4 references php4中的引用
復(fù)制代碼 代碼如下:<?php  
   $a = 5;  
   //$b points to the same place in memory as $a $b與$a指向內(nèi)存中同個(gè)地址  
   $b = &$a;  
   //we're changing $b, since $a is pointing to 改變$b,指向的地址改變  
   //the same place - it changes too $a指向的地址也改變  
   $b = 7;  
   //prints 7  輸出7  
   print $a;  
?>  由于構(gòu)建一個(gè)指向彼此的對(duì)象網(wǎng)絡(luò)是所有面向?qū)ο笤O(shè)計(jì)模式的基礎(chǔ),這個(gè)改進(jìn)具有非常重大的意義.當(dāng)引用允許建立更多強(qiáng)大的面向?qū)ο?a href=/pingce/yingyong/ target=_blank class=infotextkey>應(yīng)用程序, php對(duì)待對(duì)象和其它類(lèi)型數(shù)據(jù)相同的做法帶給開(kāi)發(fā)者極大的痛苦.就像任何php4的程序員將會(huì)告訴你的, 應(yīng)用程序?qū)?huì)遭遇WTMA(Way Too Many Ampersands過(guò)多&)綜合癥. 如果你想構(gòu)建一個(gè)實(shí)際應(yīng)用,你會(huì)感到極為痛苦,看看例6.21你就明白.
Listing 6.21 Problems with objects in php 4 php4中使用對(duì)象的問(wèn)題
復(fù)制代碼 代碼如下:1    class MyFoo {  
2        function MyFoo()  
3        {  
4            $this->me = &$this;  
5            $this->value = 5;  
6        }  
7  
8        function setValue($val)  
9        {  
10            $this->value = $val;  
11        }  
12  
13        function getValue()  
14        {  
15            return $this->value;  
16        }  
17  
18        function getValueFromMe()  
19        {  
20            return $this->me->value;  
21        }  
22    }  
23  
24        function CreateObject($class_type)  
25        {  
26            switch ($class_type) {  
27                case "foo":  
28                    $obj = new MyFoo();  
29                    break;  
30                case "bar":  
31                    $obj = new MyBar();  
32                    break;  
33            }  
34            return $obj;  
35        }  
36  
37        $global_obj = CreateObject ("foo");  
38        $global_obj->setValue(7);  
39  
40        print "Value is " . $global_obj->getValue() . "/n";  
41        print "Value is " . $global_obj->getValueFromMe() . "/n";  
讓我們一步步來(lái)討論. 首先,有一個(gè)MyFoo類(lèi).在構(gòu)造函數(shù)里,我們給$this->me一個(gè)引用,并設(shè)定
我們有其它三個(gè)成員函數(shù): 一個(gè)設(shè)定this->value的值;一個(gè)返回this->value的值;另一個(gè)返回this->value->me的值. 但是--$this不是相同的東西嗎? MyFoo::getValue()和MyFoo::getValueFromMe()返回的值不是一樣的嗎?
首先,我們調(diào)用CreateObject("foo"),這會(huì)返回一個(gè)MyFoo類(lèi)型的對(duì)象. 然后我們調(diào)用MyFoo::setValue(7). 最后,我們調(diào)用MyFoo::getValue() 和MyFoo::getValueFromMe(), 期望得到返回值7.
當(dāng)然,如果我們?cè)谌魏吻闆r下都得到7, 以上這個(gè)例子將不是本書(shū)中最沒(méi)有意義的例子. 所以我相信你已經(jīng)猜到―我們得不到兩個(gè)7這樣的結(jié)果.
但是我們將得到什么結(jié)果,并且更重要地,為什么呢?
我們將得到的結(jié)果分別是7和5. 至于為什么―--有三個(gè)很好的理由.
首先,看構(gòu)造函數(shù). 當(dāng)在構(gòu)造函數(shù)內(nèi)部,我們?cè)趖his和this->me間建立引用. 換句話說(shuō),this和this->me是同個(gè)東西. 但是我們是在構(gòu)造函數(shù)內(nèi). 當(dāng)構(gòu)造函數(shù)結(jié)束,php要重新建立對(duì)象(new MyFoo的結(jié)果,第28行)分配給$obj. 因?yàn)閷?duì)象沒(méi)有特殊化對(duì)待,就像其它任何數(shù)據(jù)類(lèi)型一樣,賦值X給Y意味著Y是X的一個(gè)副本. 也就是說(shuō),obj將是new MyFoo的一個(gè)副本,而new MyFoo是一個(gè)存在于構(gòu)造函數(shù)的對(duì)象. Obj->me怎么樣呢? 因?yàn)樗且粋€(gè)引用,它原封不動(dòng)仍然指向原來(lái)的對(duì)象―this. Voila-obj和obj->me不再是同個(gè)東西了―改變其中一個(gè)另一個(gè)不變.
以上是第一條理由. 還有其它類(lèi)似于第一條的理由. 奇跡般地我們打算克服實(shí)例化對(duì)象這個(gè)問(wèn)題(第28行). 一旦我們把CreateObject返回的值賦給global_object,我們?nèi)匀灰采舷嗤膯?wèn)題―global_object將變成返回值的一個(gè)副本,并且再次地,global_object和global_object->me將不再相同. 這就是第二條理由.
但是,事實(shí)上我們還走不了那么遠(yuǎn)― 一旦CreateObject返回$obj,我們將破壞引用(第34行) . 這就是第三條理由.
那么,我們?nèi)绾胃恼@些? 有兩個(gè)選擇. 一是在所有地方增加&符號(hào),就像例6.22那樣(第24, 28, 31, 37行). 二.如果你幸運(yùn)地使用上了php5,你可以忘了以上這一切,php5會(huì)自動(dòng)為你考慮這些. 如果你想知道php5是如何考慮這些問(wèn)題的,繼續(xù)閱讀下去.
Listing 6.22 WTMA syndrome in php 4 php4中的WTMA綜合癥
復(fù)制代碼 代碼如下:1    class MyFoo {  
2        function MyFoo()  
3        {  
4            $this->me = &$this;  
5            $this->value = 2;  
6        }  
7  
8        function setValue($val)  
9        {  
10            $this->value = $val;  
11        }  
12  
13        function getValue()  
14        {  
15            return $this->value;  
16        }  
17  
18        function getValueFromMe()  
19        {  
20            return $this->me->value;  
21        }  
22    };  
23  
24        function &CreateObject($class_type)  
25        {  
26            switch ($class_type) {  
27                case "foo":  
28                    $obj =& new MyFoo();  
29                    break;  
30                case "bar":  
31                    $obj =& new MyBar();  
32                    break;  
33            }  
34            return $obj;  
35        }  
36  
37        $global_obj =& CreateObject ("foo");  
38        $global_obj->setValue(7);  
39  
40        print "Value is " . $global_obj->getValue() . "/n";  
41        print "Value is " . $global_obj->getValueFromMe() . "/n";  
php5是第一個(gè)把對(duì)象看成與其它類(lèi)型數(shù)據(jù)不同的php版本. 從用戶(hù)的角度看,這證明它非常明白的方式―在php5中,對(duì)象總是通過(guò)引用來(lái)傳遞,而其它類(lèi)型數(shù)據(jù)(如integer,string,array)都是通過(guò)值來(lái)傳遞. 最顯著地,沒(méi)有必要再用&符號(hào)來(lái)表示通過(guò)引用來(lái)傳遞對(duì)象了.
面向?qū)ο缶幊虖V泛利用了對(duì)象網(wǎng)絡(luò)和對(duì)象間的復(fù)雜關(guān)系,這些都需要用到引用. 在php的前些版本中,需要顯示地指明引用. 因此, 現(xiàn)在默認(rèn)用引用來(lái)移動(dòng)對(duì)象,并且只有在明確要求復(fù)制時(shí)才復(fù)制對(duì)象,這樣比以前更好.
它是如何實(shí)現(xiàn)的呢?
php5之前,所有值都存在一個(gè)名為zval(Zend Value)的特殊結(jié)構(gòu)里. 這些值可以存入簡(jiǎn)單的值,如數(shù)字和字符串,或復(fù)雜的值如數(shù)組和對(duì)象. 當(dāng)值傳給函數(shù)或從函數(shù)返回時(shí),這些值會(huì)被復(fù)制,在內(nèi)存的另一個(gè)地址建立一個(gè)帶有相同內(nèi)容的結(jié)構(gòu).
php5中,值仍存為zval結(jié)構(gòu)中,但對(duì)象除外. 對(duì)象存在一個(gè)叫做Object Store的結(jié)構(gòu)里,并且每個(gè)對(duì)象有一個(gè)不同的ID. Zval中,不儲(chǔ)存對(duì)象本身,而是存著對(duì)象的指針. 當(dāng)復(fù)制一個(gè)持有對(duì)象的zval結(jié)構(gòu),例如我們把一個(gè)對(duì)象當(dāng)成參數(shù)傳給某個(gè)函數(shù),我們不再?gòu)?fù)制任何數(shù)據(jù). 我們僅僅保持相同的對(duì)象指針并由另一個(gè)zval通知現(xiàn)在這個(gè)特定的對(duì)象指向的Object Store. 因?yàn)閷?duì)象本身位于Object Store,我們對(duì)它所作的任何改變將影響到所有持有該對(duì)象指針的zval結(jié)構(gòu).這種附加的間接作用使php對(duì)象看起來(lái)就像總是通過(guò)引用來(lái)傳遞,用透明和有效率的方式. 
使用php5,我們現(xiàn)在可以回到示例6.21,除去所有的&符號(hào), 一切代碼都仍然可以正常工作.當(dāng)我們?cè)跇?gòu)造函數(shù)(第4行)中持有一個(gè)引用時(shí)一個(gè)&符號(hào)都不用. 

php技術(shù)第十五節(jié)--Zend引擎的發(fā)展,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本国产一区二区三区 | 久久综合狠狠综合久久 | 国产一级毛片午夜福 | 在线看污片 | 国产一起色一起爱 | 9久热这里只有精品免费 | 欧美日韩不卡码一区二区三区 | 91高清在线视频 | 久久久精品免费国产四虎 | 亚洲伊人久久综合 | 欧美日韩亚洲国产一区二区综合 | 久久久香蕉 | 免费大黄网站在线观看 | 丁香视频在线观看播放 | 久久久久青草大香线综合精品 | 成人在线免费小视频 | 欧美白人猛性xxxxx交69 | 国产精品亚洲片在线花蝴蝶 | 欧美激情片在线观看 | 好爽毛片一区二区三区四 | 色 在线播放 | 色婷婷天天综合在线 | 四虎影视精品永久免费网站 | 国产精品久久新婚兰兰 | 二区久久国产乱子伦免费精品 | 亚洲图片88 | 国产美女一区二区三区 | 亚洲 欧美 校园 | 欧美线人一区二区三区 | 美女掰开逼 | 夜色资源站www国产在线观看 | 久久亚洲人成国产精品 | 中文字幕久久综合 | 中文字幕精品视频在线观看 | 青青草原伊人网 | 亚洲精品伊人 | 97精品久久久久中文字幕 | 热久久最新 | 国产精品伦理一区二区三区 | 国产一区二区在线视频播放 | 精品一二 |