PHP编程中的__clone()方法使用详解


Posted in PHP onNovember 27, 2015

可以在对象类中定义一个__clone()方法来调整对象的克隆行为。此方法的代码将在克隆操作期间执行。除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作。下面修改Corporate_Drone类,增加以下方法:

function __clone() { 
 $this->tiecolor = "blue";
}

之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tiecolor确实是通过__clone()方法设置的。示例代码:

<?php
 // Create new corporatedrone object
  $drone1 = new corporatedrone();
 
 // Set the $drone1 employeeid member
  $drone1->setEmployeeID("12345");
 
 // Clone the $drone1 object
  $drone2 = clone $drone1;
 
 // Set the $drone2 employeeid member
  $drone2->setEmployeeID("67890");
 
 // Output the $drone1 and $drone2 employeeid members
  echo "drone1 employeeID: ".$drone1->getEmployeeID()."<br />";
  echo "drone2 employeeID: ".$drone2->getEmployeeID()."<br />";
  echo "drone2 tiecolor: ".$drone2->getTiecolor()."<br />";
?>

程序运行结果

drone1 employeeID: 12345
drone2 employeeID: 67890
drone2 tiecolor:

再来一个小例子:

<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";
 
 public function setName($name){
 $this->name = $name;
 }
 
 public function setColor($color){
 $this->color = $color;
 }
 
 function showColor(){
 return $this->color.'的'.$this->name."<br />";
 }
 
 function __destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = $apple;
$clone_apple->setName("小苹果");
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>

上面只是将一个类赋值给另一个类,所以此时内存中仍是一个对象。

<?php
class Fruit {
 private $name = "水果";
 private $color = "颜色";
 
 public function setName($name){
 $this->name = $name;
 }
 
 public function setColor($color){
 $this->color = $color;
 }
 
 function showColor(){
 return $this->color.'的'.$this->name."<br />";
 }
 
 function __destruct(){
 echo "被吃掉了(对象被回收) <br />"; 
 }
 function __clone(){
 $this->name = "克隆水果"; 
 }
}

$apple = new Fruit();
$apple->setName("大苹果");
$apple->setColor("红色");
echo $apple->showColor();

$clone_apple = clone $apple;
$clone_apple->setColor("青色");

echo $clone_apple->showColor();
?>

clone方法克隆出了一个新的类,所以此时内存中有两个对象。

php的__clone()方法对一个对象实例进行的浅复制,对象内的基本数值类型进行的是传值复制,而对象内的对象型成员变量,如果不重写__clone方法,显式的clone这个对象成员变量的话,这个成员变量就是传引用复制,而不是生成一个新的对象.如下面一个例子的第28行注释所说

<?php
  class Account {
    public $balance;
    
    public function __construct($balance) {
      $this->balance = $balance;
    }
  }
 
  class Person {
    private $id;
    private $name;
    private $age;
    public $account;
    
    public function __construct($name, $age, Account $account) {
      $this->name = $name;
      $this->age = $age;
      $this->account = $account;
    }
    
    public function setId($id) {
      $this->id = $id;
    }
    
    public function __clone() {  #复制方法,可在里面定义再clone是进行的操作
      $this->id = 0;
      $this->account = clone $this->account;  #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改
    }
  }
  
  $person = new Person("peter", 15, new Account(1000));
  $person->setId(1);
  $person2 = clone $person;
  
  $person2->account->balance = 250;
  
  var_dump($person, $person2);
  
 ?>

输出:

object(Person)#1 (4) { ["id":"Person":private]=> int(1) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#2 (1) { ["balance"]=> int(1000) } } object(Person)#3 (4) { ["id":"Person":private]=> int(0) ["name":"Person":private]=> string(5) "peter" ["age":"Person":private]=> int(15) ["account"]=> object(Account)#4 (1) { ["balance"]=> int(250) } }
PHP 相关文章推荐
聊天室php&amp;mysql(五)
Oct 09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
php修改时间格式的代码
May 29 PHP
PHP 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
PHP命名空间用法实例分析
Sep 04 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 #PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 #PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 #PHP
php实现遍历多维数组的方法
Nov 25 #PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 #PHP
基础的WordPress插件制作教程
Nov 24 #PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 #PHP
You might like
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
PHP的PSR规范中文版
2013/09/28 PHP
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
JavaScript执行顺序详细介绍
2013/12/04 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
Bootstrap基础学习
2015/06/16 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python判断Abundant Number的方法
2015/06/15 Python
python 以16进制打印输出的方法
2018/07/09 Python
python代码如何注释
2020/06/01 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
劲霸男装广告词
2014/03/21 职场文书
大国崛起英国观后感
2015/06/02 职场文书
《假如》教学反思
2016/02/17 职场文书
七年级作文之秋游
2019/10/21 职场文书
Nebula Graph解决风控业务实践
2022/03/31 MySQL