0

我不确定我使用的技术是否合适。我有一个类,单例,具有这样的子实例:

final class Singleton {

    public $subinstance;
    private static $instance = NULL;

    private function __construct() {
        $this->subinstance = new subinstance(); 
    }

   public static function getInstance() {

       if (NULL === self::$instance) {
           self::$instance = new self;
       }

   return self::$instance;

   }

   private function __clone() {}
}

现在,如果我想从另一个类的类外部访问子实例,我会这样做:

$s = singleton::getInstance();
$s->subinstance->....

这是正确的方法吗?当我这样做时会发生什么$s=singleton::getInstance();,整个单例类是否被复制到 $s 或者这更像是一个指针?

4

2 回答 2

3

你在做什么很好,虽然在你的示例代码中我假设你打算写:

$s = Singleton::getInstance(); // with the S capitalized

当您调用 getInstance 方法时,该类正在查看其自身的一个版本是否已被实例化。如果有,它将返回对该实例的引用,而不是创建一个全新的实例。如果实例尚未创建,它将创建实例,然后返回对它的引用。

我不确定为什么 Sixeightzero 声明你不应该在实例的构造函数中实例化一个类。这样做时您不应该遇到任何问题。

于 2012-06-07T19:16:11.493 回答
0

如果您执行 $a = singleton,则 $a 将是对单例类的引用。$a 中的任何更改都将反映在单例:: 等的访问中。(指针)

你为什么在构造函数中做一个子实例?这可能会导致问题,并且应该创建一个方法来处理受保护方法内的构造函数之外的子实例。你的子实例是什么样的?

于 2012-06-07T19:11:52.567 回答