过去,在一次求职面试中,我有一个测试问题“你如何拒绝创建类实例(对象)的副本?”.
我的回答是首先使用Singleton模式,而它根本拒绝创建实例.
但是当我最近考虑它时,我想这不是最好的答案.现在我认为使用__clone()类方法的私有范围将是一个更好的解决方案.这样它至少可以创建新实例.
但我在想,还有其他方法可以做到吗?如果未使用Singleton或未设置私有范围,是否有更好的做法如何拒绝创建实例副本?
最佳答案 还有另一种选择.将__clone()设为私有将在克隆时导致以下内容:
PHP7.x
FATAL ERROR未捕获错误:从上下文调用私有A :: __ clone()
PHP5.x
致命错误从上下文调用私有A :: __ clone()
因此,如果您希望代码在不同的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
}
或者更“花哨”的一个:
trait NotClonable {
public function __clone() {
throw new Exception('Not allowed to be cloned');
}
}
class A {
use NotClonable;
}