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和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
php生成excel文件的简单方法
Feb 08 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
php实现的ping端口函数实例
Nov 12 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
Oct 09 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP与SQL语句写一句话木马总结
Oct 11 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更快的提供文件下载的代码
2012/06/13 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
Use Word to Search for Files
2007/06/15 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
深入理解Django中内置的用户认证
2017/10/06 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
超市开学活动方案
2014/03/01 职场文书
人事经理岗位职责
2014/04/28 职场文书
初中优秀学生评语
2014/12/29 职场文书
销售经理岗位职责
2015/01/31 职场文书
《桂花雨》教学反思
2016/02/19 职场文书
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android