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 相关文章推荐
支持数组的ADDSLASHES的php函数
Feb 16 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP将回调函数作用到给定数组单元的方法
Aug 19 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP中的函数声明与使用详解
May 27 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PHP ADODB实现分页功能简单示例
May 25 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 PHP
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
Apr 01 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
咖啡的化学
2021/03/03 咖啡文化
拼音码表的生成
2006/10/09 PHP
php下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
Django实现表单验证
2018/09/08 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python如何在DataFrame增加数值
2020/02/14 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
擅自离岗检讨书
2014/02/11 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
岳庙导游词
2015/02/04 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
货款欠条范本
2015/07/03 职场文书
小学校本教研总结
2015/08/13 职场文书
创业计划书之宠物店
2019/09/19 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android