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 字段的那个点为是定界符
Jan 15 PHP
Windows PHP5和Apache的安装与配置
Jun 08 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
php随机显示图片的简单示例
Feb 15 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
ucenter通信原理分析
Jan 09 PHP
PHP多态代码实例
Jun 26 PHP
PHP中使用curl入门教程
Jul 02 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
PHP切割汉字的常用方法实例总结
Apr 27 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作为Shell脚本语言使用
2006/10/09 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
10个实用的PHP代码片段
2011/09/02 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
jquery图片滚动放大代码分享(1)
2015/08/25 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
改变vue请求过来的数据中的某一项值的方法(详解)
2018/03/08 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Python中的集合介绍
2019/01/28 Python
python 两个数据库postgresql对比
2019/10/21 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
经理秘书求职自荐信范文
2014/03/23 职场文书
爬山的活动方案
2014/08/16 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
旷工检讨书大全
2015/08/15 职场文书
离婚协议书格式范本
2016/03/18 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers