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

时间:2016-09-25 12:10:41

标签: php oop

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

我的回答是首先使用Singleton模式,但它根本拒绝创建实例。

但是当我最近想到它时,我想这不是最好的答案。现在我认为对private类方法使用__clone()范围将是一个更好的解决方案。这样它至少可以创建新实例。

但我在想,还有其他方法可以做到吗?如果未使用Singleton或未设置私有范围,是否有更好的做法如何拒绝创建实例副本?

1 个答案:

答案 0 :(得分:2)

还有另一种选择。将__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;
}