【问题标题】:Access property of 'singleton' class PHP'singleton' 类 PHP 的访问属性
【发布时间】:2012-06-07 19:09:05
【问题描述】:

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

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 中还是更像是一个指针?

【问题讨论】:

  • 我目前正在研究单例行为并了解到单例类不会执行“__construct()”函数,除非从中创建对象(在本例中为 getInstance())。此外,除非将属性声明为静态(或从中创建的对象),否则无法在单例中访问这些属性。我把这条评论留在这里,这样其他人就不会像我一样花太多时间来实现这一点。 php.net/manual/en/language.oop5.static.php

标签: php singleton instance multiple-instances


【解决方案1】:

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

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

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

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

【讨论】:

  • 这样做的方式很好。 +1
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 2014-01-30
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多