第十五節--Zend引擎的發展
本章的最後一節,Zeev討論了Zend引擎帶來的對象模型,特別提到它與PHP的前幾個版本中的模型有什麼不同.
當1997年夏天,我們開發出PHP3, 我們沒有計劃要使PHP具備面向對象的能力. 當時沒有任何與類和對象有關的想法. PHP3是一個純粹面向過程的語言. 但是,在1997.8.27的晚上PHP3 alpha版中增加了對類的支持. 增加一個新特性給PHP,當時僅需要極少的討論,因為當時探索PHP的人太少. 於是從1997年八月起, PHP邁出了走向面向對象編程語言的第一步.
確實,這只是第一步. 因為在這個設計中只有極少的相關的想法,對於對象的支持不夠強大. 這個版本中使用對象僅是訪問數組的一個很酷的方法而已. 取代使用$foo[“bar”],你可以使用看起來更漂亮的$foo->bar. 面向對象方法的主要的優勢是通過成員函數或方法來儲存功能. 例子6.18中顯示了一個典型的代碼塊. 但是它和例6.19中的做法其實並沒有太大不同.
Listing 6.18 PHP 3 object-oriented programming PHP3中的面向對象編程
<?php
class Example
{
var $value = "some value";
function PrintValue()
{
print $this->value;
}
}
$obj = new Example();
$obj->PrintValue();
?> <?php
function PrintValue($arr)
{
print $arr["value"];
}
function CreateExample()
{
$arr["value"] = "some value";
$arr["PrintValue"] = "PrintValue";
return $arr;
}
$arr = CreateExample();
//Use PHPs indirect reference
$arr["PrintValue"]($arr);
?> <?php $a = 5; //$b points to the same place in memory as $a $b與$a指向內存中同個地址 $b = &$a; //were changing $b, since $a is pointing to 改變$b,指向的地址改變 //the same place - it changes too $a指向的地址也改變 $b = 7; //prints 7 輸出7 print $a; ?>
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() . "
";
41 print "Value is " . $global_obj->getValueFromMe() . "
"; 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() . "
";
41 print "Value is " . $global_obj->getValueFromMe() . "
";