过去,在一次求职面试中,我有一个测试问题“你如何拒绝创建类实例(对象)的副本?”。
我的回答是首先使用Singleton模式,但它根本拒绝创建实例。
但是当我最近想到它时,我想这不是最好的答案。现在我认为对private
类方法使用__clone()
范围将是一个更好的解决方案。这样它至少可以创建新实例。
但我在想,还有其他方法可以做到吗?如果未使用Singleton或未设置私有范围,是否有更好的做法如何拒绝创建实例副本?
答案 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;
}