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 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
php 变量定义方法
Jun 14 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
大家都应该掌握的PHP关联数组使用技巧
Dec 25 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
php获取当前url地址的方法小结
Jan 10 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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来处理多个提交任务
2008/05/08 PHP
PHP PDO函数库详解
2010/04/27 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
实例讲解PHP表单
2020/06/10 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
Js+Ajax,Get和Post在使用上的区别小结
2016/06/08 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
python获取糗百图片代码实例
2013/12/18 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python 自由定制表格的实现示例
2020/03/20 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
酒店大堂副理的职责范文
2014/02/13 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
有关环保的标语
2014/06/13 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
红白喜事主持词
2015/07/06 职场文书
详解python的异常捕获
2022/03/03 Python