深入讨论PHP5对象复制技术(2)
来源:未知 责任编辑:责任编辑 发表时间:2014-01-25 11:34 点击:次
PHP代码
- echo 'color of tv1 is: ' . $tv1->getColor();//tv1的颜色是black
- echo '<br>';
- echo 'color of tv2 is: ' . $tv2->getColor();//tv2的颜色是black
- echo '<br>';
- //把tv2涂成白色
- $tv2->setColor('white');
- echo 'color of tv2 is: ' . $tv2->getColor();//tv2的颜色是white
- echo '<br>';
- echo 'color of tv1 is: ' . $tv1->getColor();//tv1的颜色是white
首先我们看到tv1和tv2的颜色都是black,现在我们希望tv2换个颜色,所以我们将它的颜色设置成了white,我们再看看tv2的颜色,确实成为了white,似乎满足了我们的要求,可是并没有想象中的那么顺利,当我们接着看tv1的颜色的时候,我们发现tv1也由black边成了white。我们并没有重新设置tv1的颜色,为什么tv1会重black变成white呢?这是因为PHP5中对象的赋值和传值都是以“引用”的方式。PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构----表现在程序中就是目标对象的任何改变都会影响到源对象。.这使PHP对象看起来就像总是通过引用(reference)来传递。所以以上的tv2和tv1其实是指向同一个电视机实例,我们对tv1或则tv2所做的操作其实都是针对这同一个实例。因此我们的“复制”失败了。看来直接变量赋值的方式并不能拷贝对象,为此PHP5提供了一个专门用于复制对象的操作,也就是 clone 。这就是对象复制的由来。
用clone(克隆)来复制对象
我们现在使用PHP5的clone语言结构来复制对象,代码如下:
PHP代码
- $tv1 = new Television();
- $tv2 = clone $tv1;
- echo 'color of tv1 is: ' . $tv1->getColor();//tv1的颜色是black
- echo '<br>';
- echo 'color of tv2 is: ' . $tv2->getColor();//tv2的颜色是black
- echo '<br>';
- //把tv2换成涂成白色
相关新闻>>
- 发表评论
-
- 最新评论 更多>>