国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > PHP > 正文

PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之對(duì)象克隆clone和魔術(shù)方法__clone()用法分析

2024-05-05 00:09:33
字體:
供稿:網(wǎng)友

本文實(shí)例講述了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之對(duì)象克隆clone和魔術(shù)方法__clone()用法。分享給大家供大家參考,具體如下:

1.對(duì)象克隆 clone

PHP4面向?qū)ο蠊δ芤粋€(gè)很大的缺點(diǎn),是將對(duì)象視為另一種數(shù)據(jù)類型,這使得很多常見的OOP方法無法使用,如設(shè)計(jì)模式。這些方法依賴于將對(duì)象作為引用傳遞給其他類方法,而不是作為值傳遞,而按值傳遞卻是PHP的默認(rèn)做法。幸好,PHP5解決了這個(gè)問題,現(xiàn)在所有對(duì)象在默認(rèn)情況下都被視為引用。但是,由于所有對(duì)象都被視為引用而不是值,所以現(xiàn)在復(fù)制對(duì)象更為困難。如果嘗試復(fù)制一個(gè)引用的對(duì)象,這只會(huì)指向原對(duì)象的地址位置。為了解決復(fù)制問題,PHP提供了一種克隆clone(關(guān)鍵字,不是方法)對(duì)象的顯式方法。

可以在對(duì)象前面加clone關(guān)鍵字來克隆對(duì)象,如下:

destinationObject = clone targetObject;

克隆對(duì)象:

<?phpclass Person{  var $name;  var $sex;  var $age;  function __construct($name, $sex, $age){    $this->name = $name;    $this->sex = $sex;    $this->age = $age;  }  function say(){    echo "我的名字:" . $this->name . ",性別:" . $this->sex . ",年齡:" .$this->age . "<br />";  }}$person1 = new Person("張三三", "男", 23);$person2 = clone $person1;  //使用clone關(guān)鍵字克隆/復(fù)制對(duì)象,創(chuàng)建一個(gè)對(duì)象的副本$person3 = $person1;  //這不是復(fù)制對(duì)象,而是為對(duì)象多復(fù)制出一個(gè)訪問該對(duì)象的引用$person1->say();  //調(diào)用原對(duì)象中的說話方式,打印原對(duì)象中的全部屬性值$person2->say();  //調(diào)用副本對(duì)象中的說話方式,打印克隆對(duì)象中的全部屬性值$person3->say();  //調(diào)用原對(duì)象中的說話方式,打印原對(duì)象中的全部屬性值?>

2.魔術(shù)方法__clone()

在上面的程序中一共創(chuàng)建了兩個(gè)對(duì)象,其中有一個(gè)對(duì)象是通過clone關(guān)鍵字克隆出來的副本。兩個(gè)對(duì)象完全能獨(dú)立,但他們中的成員及屬性的值完全一樣。如果需要對(duì)克隆后的副本對(duì)象在克隆時(shí)重新為成員屬性賦初值,則可以在類中聲明一個(gè)魔術(shù)方法“__clone()”。該方法是在對(duì)象克隆時(shí)自動(dòng)調(diào)用的,所以就可以通過此方法對(duì)克隆后的副本重新初始化。__clone()方法不需要任何參數(shù)。將上例中的代碼改寫一下,在類中添加魔術(shù)方法__clone(),為副本對(duì)象中的成員屬性重新初始化。

<?phpclass Person{  var $name;  var $sex;  var $age;  function __construct($name, $sex, $age){    $this->name = $name;    $this->sex = $sex;    $this->age = $age;  }  function say(){    echo "我的名字:" . $this->name . ",性別:" . $this->sex . ",年齡:" .$this->age . "<br />";  }  function __clone(){    $this->name = "李四四";  //為副本對(duì)象中的name屬性重新賦值    $this->age = 10;  //為副本對(duì)象中的age屬性重新賦值  }}$person1 = new Person("張三三", "男", 23);$person2 = clone $person1; //創(chuàng)建一個(gè)對(duì)象的副本,并自動(dòng)調(diào)用類中的__clone()方法$person1->say();  //調(diào)用原對(duì)象中的說話方式,打印原對(duì)象中的全部屬性值$person2->say();  //調(diào)用副本對(duì)象中的說話方式,打印克隆對(duì)象中的全部屬性值?>

運(yùn)行結(jié)果:

我的名字:張三三,性別:男,年齡:23
我的名字:李四四,性別:男,年齡:10

3.單例類的加強(qiáng):禁止克隆

對(duì)于一個(gè)類的對(duì)象,如果使用“clone運(yùn)算符”,就會(huì)復(fù)制出一個(gè)和當(dāng)前對(duì)象完全一樣的新對(duì)象出來,并且,此時(shí)還會(huì)自動(dòng)調(diào)用該類的魔術(shù)方法:__clone()(只要該類中有該方法)。

則要實(shí)現(xiàn)單例類,就應(yīng)該對(duì)這個(gè)單例類的對(duì)象“禁止克隆”。在PHP中,為防止對(duì)單例類對(duì)象的克隆來打破單例類的上述實(shí)現(xiàn)形式,通常還為其提供一個(gè)空的私有 (private修飾的)__clone()方法。

首先來看“未做禁止克隆”的效果:

<?phpclass SingetonBasic {  private static $instance; //靜態(tài)變量要私有化,防止類外修改  private function __construct() {  //構(gòu)造函數(shù)私有化,類外不能直接新建對(duì)象}//private function __clone() {} //在__clone()前用private修飾,用來禁止克隆public static function getInstance() { //公共的靜態(tài)方法,public——外部的接口,static——不使用對(duì)象而是通過類名訪問  if (!(self::$instance instanceof self)) { //私有靜態(tài)變量$instance為空    self::$instance = new self(); //新建為自身的對(duì)象,并賦值給私有變量$instance  }  return self::$instance; //返回私有變量$instance}}$a = SingetonBasic::getInstance();$b = SingetonBasic::getInstance();var_dump($a === $b);  //結(jié)果為:boolean true   a和b指向的是同一個(gè)對(duì)象$c = clone $a;var_dump($a === $c); //結(jié)果為:boolean false   a和c指向的不是同一個(gè)對(duì)象?>

運(yùn)行結(jié)果為

boolean true

boolean false

我們“作禁止克隆”處理,即把上面代碼中的

private function __clone() {}  //在__clone()前用private修飾,用來禁止克隆

這行代碼去掉注釋。

運(yùn)行結(jié)果為

boolean true

Fatal error: Call to private SingetonBasic::__clone()

也就是,在克隆的時(shí)候,自動(dòng)調(diào)用了__clone(),但是該方法被private修飾,不能再類的外部直接調(diào)用,結(jié)果報(bào)錯(cuò)。

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 安溪县| 新龙县| 郸城县| 柳河县| 普定县| 鄂温| 阳曲县| 崇州市| 德惠市| 商洛市| 德惠市| 兴安县| 盐边县| 依安县| 海盐县| 鞍山市| 台南市| 曲松县| 田阳县| 耿马| 新兴县| 三亚市| 兴隆县| 平泉县| 海门市| 新田县| 元谋县| 邯郸市| 纳雍县| 沂源县| 永年县| 黔西县| 三都| 湟中县| 昭苏县| 邛崃市| 西宁市| 宣武区| 洪雅县| 依安县| 平远县|