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操作excel文件 基于phpexcel
Jul 02 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
php与java通过socket通信的实现代码
Oct 21 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
php用户登录之cookie信息安全分析
May 13 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP中常用的魔术方法
Apr 28 PHP
利用PHP判断是否是连乘数字串的方法示例
Jul 03 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
laravel5.6中的外键约束示例
Oct 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 Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
php轻松实现文件上传功能
2016/03/03 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
TBCompressor js代码压缩
2011/01/05 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
node.js基础知识小结
2018/02/26 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
Python3处理文件中每个词的方法
2015/05/22 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
期末复习计划
2015/01/19 职场文书
信访工作个人总结
2015/03/03 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
Python first-order-model实现让照片动起来
2022/06/25 Python