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基础知识:控制结构
Dec 13 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
destoon出现验证码不显示时的紧急处理方法
Aug 22 PHP
PHP实现的简单分页类及用法示例
May 06 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
一文搞懂php的垃圾回收机制
Jun 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 定界符 使用技巧
2009/06/14 PHP
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
详解如何优雅地在React项目中使用Redux
2017/12/28 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
用python代码做configure文件
2014/07/20 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python 实现二维字典的键值合并等函数
2019/12/06 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
集中整治工作方案
2014/05/01 职场文书
普通话宣传标语
2014/06/26 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
2014和解协议书范文
2014/09/15 职场文书
安全承诺书
2015/01/19 职场文书
小学母亲节活动总结
2015/02/10 职场文书
学校团代会开幕词
2016/03/04 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript