2016-09-25 56 views
4

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

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

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

但我在想,有没有其他的方法怎么做呢?如果没有使用Singleton或未设置私有范围,有没有更好的做法来拒绝创建副本实例?

+2

如果'克隆'类实例和'__clone'方法存在,'__clone'方法将被调用。如果它是私密的,克隆将失败。 https://3v4l.org/IaXfI如果你想拒绝克隆一个实例,这是唯一的方法。 –

回答

2

还有另一种选择。使得__clone()私有会导致克隆时,以下几点:

PHP7.x 致命错误未捕获的错误:从上下文中

PHP5.x 致命错误呼叫到私人电话私人A :: __的clone() 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; 
} 
+0

这种东西对于'特质'来说是完美的,因为它很容易在多个类中重用,并且不是特定于类本身。 –