主頁 > 知識庫 > PHP面向?qū)ο蟪绦蛟O(shè)計之對象克隆clone和魔術(shù)方法__clone()用法分析

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

熱門標(biāo)簽:開發(fā)地圖標(biāo)注類網(wǎng)站 百度地圖標(biāo)注偏差 外呼系統(tǒng)能給企業(yè)帶來哪些好處 400電話蘭州申請請 百度地圖怎樣標(biāo)注圖標(biāo) 咸寧銷售電銷機器人系統(tǒng) 電銷機器人問門薩維品牌my 余姚電話機器人 廣東廣州在怎么申請400電話

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

1.對象克隆 clone

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

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

destinationObject = clone targetObject;

克隆對象:

?php
class 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ù)制對象,創(chuàng)建一個對象的副本
$person3 = $person1;  //這不是復(fù)制對象,而是為對象多復(fù)制出一個訪問該對象的引用
$person1->say();  //調(diào)用原對象中的說話方式,打印原對象中的全部屬性值
$person2->say();  //調(diào)用副本對象中的說話方式,打印克隆對象中的全部屬性值
$person3->say();  //調(diào)用原對象中的說話方式,打印原對象中的全部屬性值
?>

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

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

?php
class 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 = "李四四";  //為副本對象中的name屬性重新賦值
    $this->age = 10;  //為副本對象中的age屬性重新賦值
  }
}
$person1 = new Person("張三三", "男", 23);
$person2 = clone $person1; //創(chuàng)建一個對象的副本,并自動調(diào)用類中的__clone()方法
$person1->say();  //調(diào)用原對象中的說話方式,打印原對象中的全部屬性值
$person2->say();  //調(diào)用副本對象中的說話方式,打印克隆對象中的全部屬性值
?>

運行結(jié)果:

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

3.單例類的加強:禁止克隆

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

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

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

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

運行結(jié)果為

boolean true

boolean false

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

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

這行代碼去掉注釋。

運行結(jié)果為

boolean true

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

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

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

您可能感興趣的文章:
  • PHP 預(yù)定義變量、魔術(shù)常量和魔術(shù)方法功能與用法小結(jié)
  • 基于PHP的加載類操作以及其他兩種魔術(shù)方法的應(yīng)用實例
  • PHP魔術(shù)方法之__call與__callStatic使用方法
  • php類自動裝載、鏈?zhǔn)讲僮鳌⒛g(shù)方法實現(xiàn)代碼
  • PHP之十六個魔術(shù)方法詳細介紹
  • PHP的重載使用魔術(shù)方法代碼實例詳解

標(biāo)簽:麗江 重慶 銅陵 鷹潭 臨沂 十堰 巴彥淖爾 衡陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP面向?qū)ο蟪绦蛟O(shè)計之對象克隆clone和魔術(shù)方法__clone()用法分析》,本文關(guān)鍵詞  PHP,面向,對象,程序設(shè)計,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP面向?qū)ο蟪绦蛟O(shè)計之對象克隆clone和魔術(shù)方法__clone()用法分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP面向?qū)ο蟪绦蛟O(shè)計之對象克隆clone和魔術(shù)方法__clone()用法分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章