<?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