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.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
php实现图片缩放功能类
Dec 18 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
PHP框架性能测试报告
May 08 PHP
Yii框架数据模型的验证规则rules()被执行的方法
Dec 02 PHP
php实现的中文分词类完整实例
Feb 06 PHP
php多文件打包下载的实例代码
Jul 12 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 PHP
关于PHP求解三数之和问题详析
Nov 09 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
php 进度条实现代码
2009/03/10 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
PHP使用递归生成文章树
2015/04/21 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
JavaScript获取页面中第一个锚定文本的方法
2015/04/03 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
pandas 选择某几列的方法
2018/07/03 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
大课间活动实施方案
2014/03/06 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
通报表扬范文
2015/01/17 职场文书
感谢信格式范文
2015/01/22 职场文书
十二生肖观后感
2015/06/12 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis