'singleton'类PHP的访问属性

时间:2012-06-07 19:09:06

标签: php singleton instance multiple-instances

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

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中,或者这更像是指针?

2 个答案:

答案 0 :(得分:2)

你正在做的事情很好,尽管在你的示例代码中我假设你打算写:

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

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

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

答案 1 :(得分:0)

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

的访问中

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