欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
PHP5的對象模型[14]--Zend引擎的發(fā)展 - Haohappy的專(zhuān)欄--PHP5研...
第十四節--Zend引擎的發(fā)展

本章的最后一節,Zeev討論了Zend引擎帶來(lái)的對象模型,特別提到它與PHP的前幾個(gè)版本中的模型有什么不同.
當1997年夏天,我們開(kāi)發(fā)出PHP3, 我們沒(méi)有計劃要使PHP具備面向對象的能力. 當時(shí)沒(méi)有任何與類(lèi)和對象有關(guān)的想法. PHP3是一個(gè)純粹面向過(guò)程的語(yǔ)言. 但是,在1997.8.27的晚上PHP3 alpha版中增加了對類(lèi)的支持. 增加一個(gè)新特性給PHP,當時(shí)僅需要極少的討論,因為當時(shí)探索PHP的人太少. 于是從1997年八月起, PHP邁出了走向面向對象編程語(yǔ)言的第一步.

確實(shí),這只是第一步. 因為在這個(gè)設計中只有極少的相關(guān)的想法,對于對象的支持不夠強大. 這個(gè)版本中使用對象僅是訪(fǎng)問(wèn)數組的一個(gè)很酷的方法而已. 取代使用$foo[“bar”],你可以使用看起來(lái)更漂亮的$foo->bar. 面向對象方法的主要的優(yōu)勢是通過(guò)成員函數或方法來(lái)儲存功能. 例子6.18中顯示了一個(gè)典型的代碼塊. 但是它和例6.19中的做法其實(shí)并沒(méi)有太大不同.

Listing 6.18 PHP 3 object-oriented programming PHP3中的面向對象編程


class Example
{
var $value = "some value";
function PrintValue()
{
print $this->value;
}
}
$obj = new Example();
$obj->PrintValue();
?>




Listing 6.19 PHP 3 structural programming PHP3 PHP3中的結構化編程


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);
?>



以上我們在類(lèi)中寫(xiě)上兩行代碼,或者顯示地傳遞數組給函數. 但考慮到PHP3中這兩種選擇并沒(méi)有任何不同,我們仍然可以?xún)H把對象模型當成一種”語(yǔ)法上的粉飾”來(lái)訪(fǎng)問(wèn)數組.

想要用PHP來(lái)進(jìn)行面向對象開(kāi)發(fā)的人們,特別是想使用設計模式的人,很快就發(fā)現他們碰壁了. 幸運地,當時(shí)(PHP3時(shí)代)沒(méi)有太多人想用PHP來(lái)進(jìn)行面向對象開(kāi)發(fā).

PHP4改變了這種情況. 新的版本帶來(lái)了引用(reference)的概念, 它允許PHP的不同標識符指向內存中的同一個(gè)地址. 這意味著(zhù)你可以使用兩個(gè)或更多的名稱(chēng)來(lái)給同一個(gè)變量命名,就像例6.20那樣.

Listing 6.20 PHP 4 references PHP4中的引用



$a = 5;

//$b points to the same place in memory as $a $b與$a指向內存中同個(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è)指向彼此的對象網(wǎng)絡(luò )是所有面向對象設計模式的基礎,這個(gè)改進(jìn)具有非常重大的意義.當引用允許建立更多強大的面向對象應用程序, PHP對待對象和其它類(lèi)型數據相同的做法帶給開(kāi)發(fā)者極大的痛苦.就像任何PHP4的程序員將會(huì )告訴你的, 應用程序將會(huì )遭遇WTMA(Way Too Many Ampersands過(guò)多&)綜合癥. 如果你想構建一個(gè)實(shí)際應用,你會(huì )感到極為痛苦,看看例6.21你就明白.

Listing 6.21 Problems with objects in PHP 4 PHP4中使用對象的問(wèn)題

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).在構造函數里,我們給$this->me一個(gè)引用,并設定
我們有其它三個(gè)成員函數: 一個(gè)設定this->value的值;一個(gè)返回this->value的值;另一個(gè)返回this->value->me的值. 但是--$this不是相同的東西嗎? MyFoo::getValue()和MyFoo::getValueFromMe()返回的值不是一樣的嗎?

首先,我們調用CreateObject("foo"),這會(huì )返回一個(gè)MyFoo類(lèi)型的對象. 然后我們調用MyFoo::setValue(7). 最后,我們調用MyFoo::getValue() 和MyFoo::getValueFromMe(), 期望得到返回值7.
當然,如果我們在任何情況下都得到7, 以上這個(gè)例子將不是本書(shū)中最沒(méi)有意義的例子. 所以我相信你已經(jīng)猜到—我們得不到兩個(gè)7這樣的結果.

但是我們將得到什么結果,并且更重要地,為什么呢?

我們將得到的結果分別是7和5. 至于為什么—--有三個(gè)很好的理由.

首先,看構造函數. 當在構造函數內部,我們在this和this->me間建立引用. 換句話(huà)說(shuō),this和this->me是同個(gè)東西. 但是我們是在構造函數內. 當構造函數結束,PHP要重新建立對象(new MyFoo的結果,第28行)分配給$obj. 因為對象沒(méi)有特殊化對待,就像其它任何數據類(lèi)型一樣,賦值X給Y意味著(zhù)Y是X的一個(gè)副本. 也就是說(shuō),obj將是new MyFoo的一個(gè)副本,而new MyFoo是一個(gè)存在于構造函數的對象. Obj->me怎么樣呢? 因為它是一個(gè)引用,它原封不動(dòng)仍然指向原來(lái)的對象—this. Voila-obj和obj->me不再是同個(gè)東西了—改變其中一個(gè)另一個(gè)不變.

以上是第一條理由. 還有其它類(lèi)似于第一條的理由. 奇跡般地我們打算克服實(shí)例化對象這個(gè)問(wèn)題(第28行). 一旦我們把CreateObject返回的值賦給global_object,我們仍然要撞上相同的問(wèn)題—global_object將變成返回值的一個(gè)副本,并且再次地,global_object和global_object->me將不再相同. 這就是第二條理由.

但是,事實(shí)上我們還走不了那么遠— 一旦CreateObject返回$obj,我們將破壞引用(第34行) . 這就是第三條理由.

那么,我們如何改正這些? 有兩個(gè)選擇. 一是在所有地方增加&符號,就像例6.22那樣(第24, 28, 31, 37行). 二.如果你幸運地使用上了PHP5,你可以忘了以上這一切,PHP5會(huì )自動(dòng)為你考慮這些. 如果你想知道PHP5是如何考慮這些問(wèn)題的,繼續閱讀下去.

Listing 6.22 WTMA syndrome in PHP 4 PHP4中的WTMA綜合癥

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è)把對象看成與其它類(lèi)型數據不同的PHP版本. 從用戶(hù)的角度看,這證明它非常明白的方式—在PHP5中,對象總是通過(guò)引用來(lái)傳遞,而其它類(lèi)型數據(如integer,string,array)都是通過(guò)值來(lái)傳遞. 最顯著(zhù)地,沒(méi)有必要再用&符號來(lái)表示通過(guò)引用來(lái)傳遞對象了.

面向對象編程廣泛利用了對象網(wǎng)絡(luò )和對象間的復雜關(guān)系,這些都需要用到引用. 在PHP的前些版本中,需要顯示地指明引用. 因此, 現在默認用引用來(lái)移動(dòng)對象,并且只有在明確要求復制時(shí)才復制對象,這樣比以前更好.

它是如何實(shí)現的呢?

在PHP5之前,所有值都存在一個(gè)名為zval(Zend Value)的特殊結構里. 這些值可以存入簡(jiǎn)單的值,如數字和字符串,或復雜的值如數組和對象. 當值傳給函數或從函數返回時(shí),這些值會(huì )被復制,在內存的另一個(gè)地址建立一個(gè)帶有相同內容的結構.

在PHP5中,值仍存為zval結構中,但對象除外. 對象存在一個(gè)叫做Object Store的結構里,并且每個(gè)對象有一個(gè)不同的ID. Zval中,不儲存對象本身,而是存著(zhù)對象的指針. 當復制一個(gè)持有對象的zval結構,例如我們把一個(gè)對象當成參數傳給某個(gè)函數,我們不再復制任何數據. 我們僅僅保持相同的對象指針并由另一個(gè)zval通知現在這個(gè)特定的對象指向的Object Store. 因為對象本身位于Object Store,我們對它所作的任何改變將影響到所有持有該對象指針的zval結構.這種附加的間接作用使PHP對象看起來(lái)就像總是通過(guò)引用來(lái)傳遞,用透明和有效率的方式.

使用PHP5,我們現在可以回到示例6.21,除去所有的&符號, 一切代碼都仍然可以正常工作.當我們在構造函數(第4行)中持有一個(gè)引用時(shí)一個(gè)&符號都不用.
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
js語(yǔ)言規范ES5、6、7
編程風(fēng)格
深入理解PHP原理之對象(一) | 風(fēng)雪之隅
json在php與js中的應用
php如何解析JSON數據
JavaScript面向對象的支持
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久