如何拒绝在PHP中创建实例副本?
在过去的一次面试中,我有一个测试题“你们如何拒绝创建类实例(对象)的副本?” 我的答案是首先使用单例模式,而它根本拒绝创建实例 但当我最近思考这个问题时,我想这不是最好的答案。现在我认为对如何拒绝在PHP中创建实例副本?,php,oop,Php,Oop,在过去的一次面试中,我有一个测试题“你们如何拒绝创建类实例(对象)的副本?” 我的答案是首先使用单例模式,而它根本拒绝创建实例 但当我最近思考这个问题时,我想这不是最好的答案。现在我认为对\uu clone()类方法使用private作用域将是一个更好的解决方案。这样,它至少允许创建新实例 但我在想,还有其他方法吗?如果未使用Singleton或未设置私有作用域,是否有更好的做法来拒绝创建实例副本?还有另一个选项。将_clone()设为私有将导致克隆时出现以下情况: PHP7.x 致命错误未捕获
\uu clone()
类方法使用private
作用域将是一个更好的解决方案。这样,它至少允许创建新实例
但我在想,还有其他方法吗?如果未使用Singleton或未设置私有作用域,是否有更好的做法来拒绝创建实例副本?还有另一个选项。将_clone()设为私有将导致克隆时出现以下情况: PHP7.x 致命错误未捕获错误:从上下文调用私有A::\uu clone() PHP5.x 从上下文调用私有A::\克隆()时发生致命错误 因此,如果希望代码在不同的PHP版本中表现完全相同,可以执行以下操作:
<?php
class A {
public function __clone() {
throw new Exception('Not allowed to be cloned');
}
}
$a = new A;
try {
$b = clone $a;
} catch (Exception $e) {
echo $e->getMessage(); //Not allowed to be cloned
}
如果
clone
类实例和\uuu clone
方法存在,将调用\uu clone
方法。如果它是私有的,克隆将失败。如果您想拒绝克隆实例,这是唯一的方法。这种方法非常适合特性
,因为它非常容易跨多个类重复使用,并且不特定于类本身。
trait NotClonable {
public function __clone() {
throw new Exception('Not allowed to be cloned');
}
}
class A {
use NotClonable;
}