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

过去,在一次求职面试中,我有一个测试问题“你如何拒绝创建类实例(对象)的副本?”.

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