我不确定我使用的技术是否合适。 我有一个类,单身,有这样的子实例:
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中,或者这更像是指针?
答案 0 :(得分:2)
你正在做的事情很好,尽管在你的示例代码中我假设你打算写:
$s = Singleton::getInstance(); // with the S capitalized
当您调用getInstance方法时,该类正在查看是否已经实例化了自身的版本。如果有,它将返回对该实例的引用,而不是创建一个全新的实例。如果尚未创建实例,它将创建实例,然后返回对它的引用。
我不确定为什么sixeightzero声明你不应该在你的实例的构造函数中实例化一个类。这样做时不应该遇到任何问题。
答案 1 :(得分:0)
如果你执行$ a = singleton,$ a将是对单例类的引用。 $ a中的任何更改都将反映在singleton :: etc ..(指针)
的访问中为什么要在构造函数中执行子实例?这可能会导致问题,并应创建一个方法来处理受保护方法内构造函数外部的子实例。你的子实例是什么样的?