在过去的一次面试中,我有一个测试问题"你如何否认创建类实例(对象)的副本?"。
我的答案是首先使用Singleton模式,因为它根本拒绝创建实例。
但是当我最近思考这个问题的时候,我想这不是最好的答案。现在我认为使用private
范围__clone()
类方法将是一个更好的解决方案。这样至少可以创建新的实例。
但是我在想,有没有其他方法可以做到呢?如果没有使用Singleton或者没有设置private作用域,有没有更好的实践来拒绝实例副本的创建?
还有另一种选择。将__clone()设为私有将导致克隆时出现以下情况:
PHP7.x从上下文
调用私有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;
}