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 相关文章推荐
批量修改RAR文件注释的php代码
Nov 20 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
php实现递归抓取网页类实例
Apr 03 PHP
php搜索文件程序分享
Oct 30 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
PHP flush 函数使用注意事项
Aug 26 PHP
tp5.1 实现setInc字段自动加1
Oct 18 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下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
在vue项目中安装使用Mint-UI的方法
2017/12/27 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
最新计算机专业自荐信
2013/10/16 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
认错检讨书
2014/10/02 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
总结Python使用过程中的bug
2021/06/18 Python
Python之matplotlib绘制饼图
2022/04/13 Python