如何拒绝在PHP中创建实例的副本


How do you deny creating copy of instance in PHP?

在过去的一次面试中,我有一个测试问题"你如何否认创建类实例(对象)的副本?"。

我的答案是首先使用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;
}