登录  /  注册

php面向对象之对象克隆方法

巴扎黑
发布: 2017-04-17 14:38:58
原创
1679人浏览过

前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在php中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰。

我们举个简单的例子来看一下克隆的用法:

<?php
header("content-type:text/html;charset=utf-8");
class Character{                                                       //定义一个角色类
public $name;
protected $location;
function __construct($name , $location)              //创建构造函数
{
$this->name = $name;
$this->location = $location;
}
function play(){                                                      //创建方法
echo &#39;我要玩&#39; .  $this->name.$this->location;
}
}
$character1 = new Character(&#39;亚索&#39;,&#39;中单&#39;);                //实例化一个类
$character2 = clone $character1;                               //将实例化的类再克隆出来一个
$character1->play();                                                    //调用方法执行
echo &#39;<br/>&#39;;
$character2->play();
登录后复制

上述实例的结果都是‘我要玩亚索中单’。

上面我们说到克隆的副本和原本独立而互不干扰,这句话又是什么意思呢?

还是上面的实例,只是稍微发生点变动。

<?php
header("content-type:text/html;charset=utf-8");
class Character{                                                       //定义一个角色类
public $name;
public $location;
function __construct($name , $location)              //创建构造函数
{
$this->name = $name;
$this->location = $location;
}
function play(){                                                      //创建方法
echo &#39;我要玩&#39; .  $this->name.$this->location;
}
}
$character1 = new Character(&#39;亚索&#39;,&#39;中单&#39;);                //实例化一个类
$character2 = clone $character1;
$character2->location = &#39;上单&#39;;
$character1->play();                                                    //调用方法执行
echo &#39;<br/>&#39;;
$character2->play();
登录后复制

上述实例的结果就是‘我要玩亚索中单’和'我要玩亚索上单'。

由例子可以看出克隆出来的副本和原本两个对象完全独立而互不干扰。

__clone的用法

很多时候我们不单单要去克隆一个对象,还想让对象可以拥有自己的属性和方法。那么我们就要在类中创建一个__clone方法。这个方法类似于构造函数和析构函数,因为不会直接调用它。

还是以上面的实例为例:

<?php
header("content-type:text/html;charset=utf-8");
class Character{                                                       //定义一个角色类
public $name;
public $location;
function __construct($name , $location)              //创建构造函数
{
$this->name = $name;
$this->location = $location;
}
function __clone(){
$this -> location = &#39;上单&#39;;
}
function play(){                                                      //创建方法
echo &#39;我要玩&#39; .  $this->name.$this->location;
}
}
$character1 = new Character(&#39;亚索&#39;,&#39;中单&#39;);                //实例化一个类
$character2 = clone $character1;
$character1->play();                                                    //调用方法执行
echo &#39;<br/>&#39;;
$character2->play();
登录后复制

__clone方法的一个很好的特性就是在使用默认行为创建一个副本之后能够被调用,这样,在这个阶段,可以只改变希望改变的内容。

在__clone方法中添加的最常见功能就是确保作为引用进行处理的类属性能够正确的复制。如果要克隆一个包含对象引用的类,可能需要获得该对象的第二个副本,而不是该对象的第二个引用,因此这就是为什么要在__clone方法中添加该代码的原因。

以上就是php面向对象之对象克隆方法的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号