Zend引擎的发展(3)

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是第一个把对象看成与其它类型数据不同的PHP版本. 从用户的角度看,这证明它非常明白的方式—在PHP5中,对象总是通过引用来传递,而其它类型数据(如integer,string,array)都是通过值来传递. 最显著地,没有必要再用&符号来表示通过引用来传递对象了.
面向对象编程广泛利用了对象网络和对象间的复杂关系,这些都需要用到引用. 在PHP的前些版本中,需要显示地指明引用. 因此, 现在默认用引用来移动对象,并且只有在明确要求复制时才复制对象,这样比以前更好.
它是如何实现的呢?
在PHP5之前,所有值都存在一个名为zval(Zend Value)的特殊结构里. 这些值可以存入简单的值,如数字和字符串,或复杂的值如数组和对象. 当值传给函数或从函数返回时,这些值会被复制,在内存的另一个地址建立一个带有相同内容的结构.
在PHP5中,值仍存为zval结构中,但对象除外. 对象存在一个叫做Object Store的结构里,并且每个对象有一个不同的ID. Zval中,不储存对象本身,而是存着对象的指针. 当复制一个持有对象的zval结构,例如我们把一个对象当成参数传给某个函数,我们不再复制任何数据. 我们仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store. 因为对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构.这种附加的间接作用使PHP对象看起来就像总是通过引用来传递,用透明和有效率的方式. 
使用PHP5,我们现在可以回到示例6.21,除去所有的&符号, 一切代码都仍然可以正常工作.当我们在构造函数(第4行)中持有一个引用时一个&符号都不用. 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1f57c5e6798ef6fa51e76bc279a2caf4.html