91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP對象復制舉例分析

發布時間:2021-11-25 16:42:11 來源:億速云 閱讀:139 作者:iii 欄目:大數據

本篇內容主要講解“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對象復制舉例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

防城港市| 永胜县| 洱源县| 安溪县| 渝北区| 南澳县| 靖西县| 望奎县| 二手房| 榆林市| 饶平县| 屏东县| 潼南县| 察哈| 祥云县| 抚顺市| 和平县| 瓦房店市| 钟山县| 盐池县| 西乌珠穆沁旗| 彰化县| 宝丰县| 万州区| 郧西县| 武定县| 台南县| 兰州市| 松阳县| 公安县| 龙井市| 获嘉县| 含山县| 察哈| 乐山市| 莱芜市| 淮北市| 玉林市| 宿迁市| 东山县| 乌审旗|