php对象克隆clone概述

php 对象复制,是复制对象的引用地址,因此使用 $objA = $objB 这种写法时,$objA与$objB会指向相同的内存地址。当$objA 发生变化时,$objB也会受到影响。

如果我们要$objA对象复制为$objB对象,复制之后,$objA有什么变化,都不会影响$objB。即$objA与$objB是两个独立的对象,但$objB的初始值是由$objA创建的,比较高效的做法是使用clone()方法。

$objB = clone $objA;

$objB的值是在$objA基础加$objA事例对象里clone()方法改变后的实例。

当对象被复制后,所有的属性中的引用保持不变,指向原来的变量,如果定义了__clone()方法,则新创建的对象中的__clone()方法会被调用,可用于修改属性的值。

例子1:clone 对象

<?php
class subclass{  

    private $name;
    private $age;  

    public function __construct(){
        $this->name = 'fdipzone';
        $this->age = '30';
    }  

    public function __clone(){
        $this->name = 'xfdipzone';
        $this->age = '29';
    }  

}  

class myclass{  

    public $p1;
    public $p2;  

    public function __construct(){  

    }  

    public function __clone(){
        $this->p1 = clone $this->p1;
    }  

}  

$obj = new myclass();
$obj->p1 = new subclass();
$obj->p2 = new subclass();  

$obj2 = clone $obj;  

echo '<pre>';
echo 'obj<br>';
var_dump($obj);
echo '<br>obj2<br>';
var_dump($obj2);
echo 'ok';
echo '</pre>';  

?>

上例将输出:

obj
object(myclass)#1 (2) {
  ["p1"]=>
  object(subclass)#2 (2) {
    ["name":"subclass":private]=>
    string(8) "fdipzone"
    ["age":"subclass":private]=>
    string(2) "30"
  }
  ["p2"]=>
  object(subclass)#3 (2) {
    ["name":"subclass":private]=>
    string(8) "fdipzone"
    ["age":"subclass":private]=>
    string(2) "30"
  }
}  

obj2
object(myclass)#4 (2) {
  ["p1"]=>
  object(subclass)#5 (2) {
    ["name":"subclass":private]=>
    string(9) "xfdipzone"
    ["age":"subclass":private]=>
    string(2) "29"
  }
  ["p2"]=>
  object(subclass)#3 (2) {
    ["name":"subclass":private]=>
    string(8) "fdipzone"
    ["age":"subclass":private]=>
    string(2) "30"
  }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 对象
, object
, private
, 方法
clone
php clone对象克隆、php clone对象、php 克隆对象、jq clone 克隆事件、vmrun clone 克隆,以便于您获取更多的相关知识。

时间: 2024-09-20 09:35:43

php对象克隆clone概述的相关文章

PHP对象克隆clone用法示例_php技巧

本文实例讲述了PHP对象克隆clone用法.分享给大家供大家参考,具体如下: 浅克隆:只是克隆对象中的非对象非资源数据,即对象中属性存储的是对象类型,则会出现克隆不完全 <?php class B{ public $val = 10; } class A{ public $val = 20; public $b; public function __construct(){ $this->b = new B(); } } $obj_a = new A(); $obj_b = clone $ob

php实现对象克隆的方法

  本文实例讲述了php实现对象克隆的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?php //定义类staff,其中包括属性id和name class staff { private $id; private $name; function setID($id) { $this->id =

Java对象克隆指南

在java中,克隆是一个精确的原始拷贝,这基本上意味着能够创建一个对象相似的状态与原始对象.clone()方法提供了这种功能.在这篇文章中,我们将探讨java克隆的最重要的方面. 详细解释了克隆 Java基础克隆 浅克隆 深克隆 复制构造函数 序列化克隆 使用Apache commons克隆 最佳实践 详细解释了克隆 克隆是关于创建原始对象的副本,其词典意义是:"使一个完全相同的副本".默认情况下,java克隆"字段复制",即是对象类没有了解的结构类的clone()

php实现对象克隆的方法_php技巧

本文实例讲述了php实现对象克隆的方法.分享给大家供大家参考.具体如下: <?php //定义类staff,其中包括属性id和name class staff { private $id; private $name; function setID($id) { $this->id = $id; } function getID() { return $this->id; } function setName($name) { $this->name = $name; } func

Java利用序列化实现对象深度clone的方法_java

本文实例讲述了Java利用序列化实现对象深度clone的方法.分享给大家供大家参考.具体实现方法如下: ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(obj); ByteArrayInputStream byteIn = new ByteArrayInputStream(by

Java常用类库--对象克隆技术clone

class Person implements Cloneable{ // 实现Cloneable接口表示可以被克隆 private String name ; public Person(String name){ this.name = name ; } public void setName(String name){ this.name = name ; } public String getName(){ return this.name ; } public String toStr

如何把一个类型的对象克隆成另一个类型的对象

问题描述 如题,我试着用clone方法,但是不行 解决方案 解决方案二:呵呵clone是克隆当前对象,他怎么能变成其他类型对象呢就像你想通过羊细胞克隆个牛出来解决方案三:没看明白什么意思,举个例子,你想要什么结果?Aa=newA();Bb=a.clone();?这样的肯定不行的!除非是继承关系解决方案四:可以手动克隆啊就是用set把数据一个一个的设置解决方案五:引用1楼pofate的回复: 呵呵clone是克隆当前对象,他怎么能变成其他类型对象呢就像你想通过羊细胞克隆个牛出来 顶解决方案六:那还

详解Java中的指针、引用及对象的clone

对象|详解 Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点.看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的

JAVA中的指针,引用及对象的clone

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它们的区别.优点及缺点. 看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于