【php手册:类与对象】对象复制

7人阅读 评论(0) 收藏 举报
分类:

对象复制

使用情境:

1.如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。

2.如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

实现: 通过 clone 关键字(如果可能,这将调用对象的 __clone() 方法),对象中的 __clone() 方法不能被直接调用。

    $copy_of_object = clone $object;

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

    void __clone ( void )

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

Example #1 复制一个对象

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {

        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Original Object:\n");
print_r($obj);

/*
Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
*/

print("Cloned Object:\n");
print_r($obj2);

/*
Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
*/


?>
查看评论

php对象的拷贝原理(附图解)

php对象的拷贝有三种常用的方式:   先定义一个Dog类。              class Dog{ public $name; ...
  • xyz_dream
  • xyz_dream
  • 2017年03月21日 13:10
  • 517

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言。无论是C++、无论是Java、无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思...
  • hello_katty
  • hello_katty
  • 2015年06月17日 07:40
  • 2845

【php手册:类与对象】简介~类的自动加载

&lt;?php class Foo { public $aMemberVar = 'aMemberVar Member Variable'; public $aFunc...
  • qq_39251267
  • qq_39251267
  • 2018年02月28日 14:24
  • 22

【php手册:类与对象】抽象类

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能...
  • qq_39251267
  • qq_39251267
  • 2018年03月20日 10:10
  • 12

【php手册:类与对象】trait

Trait (PHP 5.4.0 ) 翻译Trait Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。 Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结...
  • qq_39251267
  • qq_39251267
  • 2018年03月27日 14:14
  • 17

php面向对象——类和对象

php面向对象——类和对象1.类和对象
  • GentleManStyle
  • GentleManStyle
  • 2016年04月20日 20:43
  • 2141

【php手册:类与对象】访问控制(可见性)

访问控制(可见性) public(公有)的类成员可以在任何地方被访问。 protected(受保护)的类成员则可以被本类内部以及其子类内部和父类内部访问。 private(私有)的类成员则只能被...
  • qq_39251267
  • qq_39251267
  • 2018年03月12日 09:44
  • 18

【php手册:类与对象】对象继承

Note: 除非使用了自动加载,否则一个类必须在使用之前被定义。如果一个类扩展了另一个,则父类必须在子类之前被声明。此规则适用于类继承其它类与接口。 Example #1 继承示例 &l...
  • qq_39251267
  • qq_39251267
  • 2018年03月19日 14:40
  • 11

php中对象克隆和一个简单的单列类

在多数情况下,我们并不需要完全复制一个对象来获得其中的属性。但有一个情况下确实需要:如果你有一个GTK窗口对象,该对象持有窗口的相关资源。 你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,...
  • forLightWay
  • forLightWay
  • 2017年01月17日 13:10
  • 569
    个人资料
    持之以恒
    等级:
    访问量: 7754
    积分: 1093
    排名: 4万+
    文章存档