中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

台南县| 方城县| 西平县| 芮城县| 永年县| 西盟| 聂荣县| 鲁山县| 浏阳市| 南通市| 枣强县| 社旗县| 和硕县| 苍山县| 偏关县| 吉安市| 日喀则市| 木兰县| 阳山县| 清徐县| 永安市| 洛川县| 石嘴山市| 鸡东县| 福州市| 上林县| 周口市| 惠东县| 遂平县| 南通市| 海淀区| 贺州市| 沛县| 汉源县| 安阳市| 长春市| 博乐市| 剑阁县| 新绛县| 武穴市| 靖边县|