clone关键字的使用

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

/**
 * Human类
 */
class Human
{
    private string $name;

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

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }

    /**
     * 重要提醒:将__clone()方法声明为private就可以禁止克隆本类的实例。
     */
    public function __clone()
    {
    }
}

$human1 = new Human('张三');
var_dump($human1);
// object(Human)#2 (1) {
// ["name":"Human":private]=>
//   string(6) "张三"
// }

$human2 = clone $human1;
var_dump($human2);
// object(Human)#3 (1) {
// ["name":"Human":private]=>
//   string(6) "张三"
// }

$human2->setName('李四');

echo '$human1->getName() is ' . $human1->getName() . PHP_EOL; // $human1->getName() is 张三
echo '$human2->getName() is ' . $human2->getName() . PHP_EOL; // $human2->getName() is 李四


//========== 总结 ==========//
// 1、克隆(clone)实例相当于使用new创建了一个新的独立实例,并且克隆母实例的属性和方法不受其private和protected声明的限制,
//    也就是声明为private或protected的属性和方法也会被克隆。
// 2、想要禁止一个类实例被克隆,只要将该类的__clone()方法声明为private即可。正因为如此,单例模式除了要将__construct()声明为private防止
//    使用new创建实例,还要将__clone()也声明为private防止使用clone克隆实例。

Copyright © 2024 码农人生. All Rights Reserved