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 相关文章推荐
在IIS上安装PHP4.0正式版
Oct 09 PHP
php array_intersect()函数使用代码
Jan 14 PHP
PHP的单引号和双引号 字符串效率
May 27 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
May 07 PHP
PHP多例模式介绍
Jun 24 PHP
php结合正则获取字符串中数字
Jun 19 PHP
php实现模拟post请求用法实例
Jul 11 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 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
递归列出所有文件和目录
2006/10/09 PHP
在数据量大(超过10万)的情况下
2007/01/15 PHP
php设计模式 Factory(工厂模式)
2011/06/26 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
jquery $.ajax入门应用一
2008/11/19 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
js html实现计算器功能
2018/11/13 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python实时获取cmd的输出
2015/12/13 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python有参函数使用代码实例
2020/01/06 Python
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
英国家用电器购物网站:Hughes
2018/02/23 全球购物
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书