您好,登錄后才能下訂單哦!
本篇內容主要講解“PHP對象復制舉例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP對象復制舉例分析”吧!
原型模式可以看作是對象復制中的一個重要內容。在學習原型模式時,我們了解到對象中的引用變量,也就是變量也是一個對象時,直接復制這個對象會導致其中的引用變量還是指向同一個對象。是不是有點繞,我們還是用例子來說明:
// clone方法
class testA{
public $testValue;
}
class A
{
public static $reference = 0;
public $instanceReference = 0;
public $t;
public function __construct()
{
$this->instanceReference = ++self::$reference;
$this->t = new testA();
}
public function __clone()
{
$this->instanceReference = ++self::$reference;
$this->t = new testA();
}
}
$a1 = new A();
$a2 = new A();
$a11 = clone $a1;
$a22 = $a2;
var_dump($a11); // $instanceReference, 3
var_dump($a22); // $instanceReference, 2
$a1->t->testValue = '現在是a1';
echo $a11->t->testValue, PHP_EOL; // ''
$a2->t->testValue = '現在是a2';
echo $a22->t->testValue, PHP_EOL; // 現在是a2
$a22->t->testValue = '現在是a22';
echo $a2->t->testValue, PHP_EOL; // 現在是a22
// 使用clone后
$a22 = clone $a2;
var_dump($a22); // $instanceReference, 4
$a2->t->testValue = '現在是a2';
echo $a22->t->testValue, PHP_EOL; // NULL
$a22->t->testValue = '現在是a22';
echo $a2->t->testValue, PHP_EOL; // 現在是a2
首先,通過變量的變化,我們可以看出使用clone關鍵字的對象復制會調用__clone()方法。這個魔術方法正在原型模式的核心所在。在這個方法中,我們可以重新實例化或者定義對象中的引用成員。通過clone,我們讓t成為了新的對象,從而避免引用帶來的問題。
在對象的復制中,我們需要特別注意的遞歸引用的問題。也就是對象內部引用了自身,將會導致來回的重復引用形成遞歸死循環。
// 循環引用問題
class B
{
public $that;
function __clone()
{
// Segmentation fault: 11
$this->that = clone $this->that;
// $this->that = unserialize(serialize($this->that));
// object(B)#6 (1) {
// ["that"]=>
// object(B)#7 (1) {
// ["that"]=>
// object(B)#8 (1) {
// ["that"]=>
// *RECURSION* 無限遞歸
// }
// }
// }
}
}
$b1 = new B();
$b2 = new B();
$b1->that = $b2;
$b2->that = $b1;
$b3 = clone $b1;
var_dump($b3);
B類中的that指向自身的實例,兩個對象相互指向后再進行復制,就會出現這種死循環的情況。使用序列化和反序列化輸出后,我們會看到RECURSION的引用提示。這就是形成了遞歸的死循環。這種情況一定要極力避免。
上述例子中,我們使用了序列化和反序列化這一招來解決引用問題。對象復制的對象變量來說(對象變量里面還有更多層次的引用變量),這種方式能夠一次性地在最頂層的對象__clone()方法中解決引用問題。
到此,相信大家對“PHP對象復制舉例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。