最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年06月12日 10:06:07   作者:Yeoman92  
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之對(duì)象克隆clone和魔術(shù)方法__clone()用法,結(jié)合具體實(shí)例形式分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中對(duì)象克隆clone和魔術(shù)方法__clone()相關(guān)操作技巧與使用注意事項(xià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ì)象:

<?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ù)制對(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ì)象中的成員屬性重新初始化。

<?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 = "李四四";  //為副本對(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()方法。

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

<?php
class 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ò)。

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

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

相關(guān)文章

  • php在數(shù)組中查找指定值的方法

    php在數(shù)組中查找指定值的方法

    這篇文章主要介紹了php在數(shù)組中查找指定值的方法,實(shí)例分析了php中array_search函數(shù)查找數(shù)組指定值的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • PHP利用ffmpeg獲取音頻、視頻的詳細(xì)信息

    PHP利用ffmpeg獲取音頻、視頻的詳細(xì)信息

    這篇文章給大家介紹了使用PHP利用ffmpeg獲取音頻、視頻的詳細(xì)信息,音視頻總時(shí)長、碼率、視頻分辨率、音頻編碼、音頻采樣頻率、實(shí)際播放時(shí)間、文件大小,文中給出詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-01-01
  • PHP日期時(shí)間函數(shù)的高級(jí)應(yīng)用技巧

    PHP日期時(shí)間函數(shù)的高級(jí)應(yīng)用技巧

    PHP的日期時(shí)間函數(shù)date()中介紹了PHP日期時(shí)間函數(shù)的簡單用法,這類將介紹更多的函數(shù)來豐富我們的應(yīng)用。
    2009-05-05
  • PHP生成各種隨機(jī)驗(yàn)證碼的方法總結(jié)【附demo源碼】

    PHP生成各種隨機(jī)驗(yàn)證碼的方法總結(jié)【附demo源碼】

    這篇文章主要介紹了PHP生成各種隨機(jī)驗(yàn)證碼的方法,結(jié)合具體實(shí)例形式總結(jié)分析了php常用的生成驗(yàn)證碼操作相關(guān)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2017-06-06
  • php similar_text()函數(shù)的定義和用法

    php similar_text()函數(shù)的定義和用法

    下面小編就為大家?guī)硪黄猵hp similar_text()函數(shù)的定義和用法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • php實(shí)現(xiàn)MD5加密16位(不要默認(rèn)的32位)

    php實(shí)現(xiàn)MD5加密16位(不要默認(rèn)的32位)

    今天做了個(gè)php鏈接mssql數(shù)據(jù)庫,數(shù)據(jù)庫中的表中字段使用MD5十六加密的。但是php中的MD5默認(rèn)是32位,導(dǎo)致登錄程序沒辦法使用md5加密跟表中字段匹配,在網(wǎng)上一搜也有不少人有這方面的困惑,后來找到一個(gè)解決辦法,是正確的,就記錄下來
    2013-08-08
  • php的socket編程詳解

    php的socket編程詳解

    socket的英文原義是“孔”或“插座”。作為BSD UNIX的進(jìn)程通信機(jī)制,取后一種意思。用于描述IP地址和端口,是一個(gè)通信鏈的句柄。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開一個(gè)Socket并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)
    2016-11-11
  • PHP使用靜態(tài)方法的幾個(gè)注意事項(xiàng)

    PHP使用靜態(tài)方法的幾個(gè)注意事項(xiàng)

    這篇文章主要介紹了PHP使用靜態(tài)方法的幾個(gè)注意事項(xiàng),以實(shí)例的形式講述了PHP靜態(tài)方法調(diào)用的技巧和易錯(cuò)點(diǎn)分析,需要的朋友可以參考下
    2014-09-09
  • PHP 應(yīng)用程序的安全 -- 不能違反的四條安全規(guī)則

    PHP 應(yīng)用程序的安全 -- 不能違反的四條安全規(guī)則

    PHP 應(yīng)用程序的安全 -- 不能違反的四條安全規(guī)則...
    2006-11-11
  • PHP自定義大小驗(yàn)證碼的方法詳解

    PHP自定義大小驗(yàn)證碼的方法詳解

    本篇文章是對(duì)PHP自定義大小驗(yàn)證碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評(píng)論

湟中县| 通河县| 和林格尔县| 南华县| 南昌市| 曲周县| 黎川县| 民和| 尚志市| 留坝县| 上虞市| 和田市| 浙江省| 河东区| 新乐市| 辛集市| 略阳县| 九龙县| 鄂温| 积石山| 焦作市| 南漳县| 晋江市| 青岛市| 富蕴县| 涡阳县| 东海县| 榆树市| 随州市| 灌阳县| 陆丰市| 景宁| 大埔区| 莒南县| 囊谦县| 尉犁县| 聂荣县| 景谷| 望江县| 徐汇区| 泸州市|