深入PHP面向对象、模式与实践——高级特性(5)

析构方法

PHP5提供了一个与__construct()方法对应的方法__destruct()。它只在对象被垃圾收集器收集前(即对象从内存中删除之前)自动调用。你可以利用这个方法进行最后必要的清理工作。

class Person
{
    private $name;
    private $age;
    private $id;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age  = $age;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function __destruct()
    {
        if (!empty($this->id)) {
            //保存Person数据
            print "saving person\n";
        }
    }
}

这样无论Person对象何时从内存中删除,__destruct()方法都会被调用。当对一个对象调用unset()函数时,或者进程中不再引用某个对象时,对象就被销毁了。

使用__clone()复制对象

在PHP中,对象的赋值和传递都是通过引用进行的,但有时候我们也需要获得一个对象的副本,而不是引用。PHP提供了clone关键字来达到这个目的。在对象调用clone时,我们可以控制复制什么。我们可以通过实现一个特殊的方法__clone()来达到这个目的(注意所有以两个下划线开头的方法都是PHP内置的方法)。当在一个对象上调用clone关键字时,其方法就会被自动调用。

class Person
{
    private $name;
    private $age;
    private $id;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age  = $age;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function __clone()
    {
        $this->id = 0;
    }
}

这样的浅复制(shallow copy)可以保证所有基本数据类型的属性被完全复制。在复制对象属性时只复制引用,这可能不是你所期望的。如果不希望对象属性在被复制后被共享,那么可以显式地在__clone()方法中复制指向的对象。

class Account
{
    public $balance;

    public function __construct($balance)
    {
        $this->balance = $balance;
    }
}

class Person
{
    private $name;
    private $age;
    private $id;
    private $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()
    {
        $this->id      = 0;
        $this->account = clone $this->account;
    }
}

$person  = new Person("bob", 44, new Account(200));
$person  = setId(343);
$person2 = clone $person;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值