PHP编程中的__clone()方法使用详解
发布:smiling 来源: PHP粉丝网 添加日期:2021-06-27 13:38:42 浏览: 评论:0
这篇文章主要介绍了PHP编程中的__clone()方法使用详解,__clone()方法相当于一个浅拷贝,是PHP入门学习中的基础知识,需要的朋友可以参考下。
可以在对象类中定义一个__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) } }
Tags: __clone
相关文章
- ·php __call __autoload __clone __toString __sleep(2014-09-18)
- ·php5对象复制、clone、浅复制与深复制实例详解(2021-12-11)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)