Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何拒绝在PHP中创建实例副本?_Php_Oop - Fatal编程技术网

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

如何拒绝在PHP中创建实例副本?,php,oop,Php,Oop,在过去的一次面试中,我有一个测试题“你们如何拒绝创建类实例(对象)的副本?” 我的答案是首先使用单例模式,而它根本拒绝创建实例 但当我最近思考这个问题时,我想这不是最好的答案。现在我认为对\uu clone()类方法使用private作用域将是一个更好的解决方案。这样,它至少允许创建新实例 但我在想,还有其他方法吗?如果未使用Singleton或未设置私有作用域,是否有更好的做法来拒绝创建实例副本?还有另一个选项。将_clone()设为私有将导致克隆时出现以下情况: PHP7.x 致命错误未捕获

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

我的答案是首先使用单例模式,而它根本拒绝创建实例

但当我最近思考这个问题时,我想这不是最好的答案。现在我认为对
\uu clone()
类方法使用
private
作用域将是一个更好的解决方案。这样,它至少允许创建新实例


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

还有另一个选项。将_clone()设为私有将导致克隆时出现以下情况:

PHP7.x 致命错误未捕获错误:从上下文调用私有A::\uu clone()

PHP5.x 从上下文调用私有A::\克隆()时发生致命错误

因此,如果希望代码在不同的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
}

如果
clone
类实例和
\uuu clone
方法存在,将调用
\uu clone
方法。如果它是私有的,克隆将失败。如果您想拒绝克隆实例,这是唯一的方法。这种方法非常适合
特性
,因为它非常容易跨多个类重复使用,并且不特定于类本身。
trait NotClonable {
    public function __clone() {
            throw new Exception('Not allowed to be cloned');
    }
}
class A {
    use NotClonable;
}