【问题标题】:what is the exact difference between PHP static class and singleton classPHP静态类和单例类之间的确切区别是什么
【发布时间】:2010-05-17 14:02:46
【问题描述】:

我一直使用 Singleton 类作为 PHP 中的注册表对象。作为所有 Singleton 类,我认为主要方法如下所示:

class registry
{
    public static function singleton()
    {
        if( !isset( self::$instance ) )
        {
            self::$instance = new registry();
        }
        return self::$instance;
    }

    public function doSomething()
    {
        echo 'something';
    }
}

所以每当我需要一些注册表类的东西时,我都会使用这样的函数:

registry::singleton()->doSomethine();

现在我不明白创建一个普通的静态函数有什么区别。如果我只使用普通的静态类,它会创建一个新对象吗?

class registry
{
    public static function doSomething()
    {
        echo 'something';
    }
}

现在我可以使用了:

registry::doSomethine();

谁能给我解释一下单例类的功能是什么。这个我真的不明白。

【问题讨论】:

标签: php static singleton


【解决方案1】:

静态函数是无需创建类对象即可调用的函数。

registry::doSomething()

单例是一种设计模式,它应该防止类的用户创建多个类的实例。因此,单例类通常只有一个实例。 Singleton 的构造函数应该被声明为 private 并且有一个提供单个实例对象的静态方法:

class Singleton
{
   private Singleton()
   {
   }

   private static var $instance = null;

   public static getInstance()
   {
     if(self::$instance == null)
       self::$instance = new Singleton();
     return self::$instance; 
   }
}

欲了解更多信息,请参阅http://en.wikipedia.org/wiki/Singleton_pattern

P.S:抱歉我的 PHP 不好,语法可能不是 100% 正确,但你应该大致了解我在 OOP 方面的意思。

【讨论】:

    【解决方案2】:

    Singleton 是一种将类的实例化限制为单个对象的设计模式这一事实,可以用静态类做一些稍微困难的事情:

    • 延迟初始化
    • 通过子类化工厂替换内部实现
    • 通过配置管理

    但是,单例有几个缺点,因此通常最好使用诸如工厂之类的模式,因为您可以获得诸如解耦之类的额外好处。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2011-10-06
      • 2014-06-27
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 2016-01-19
      相关资源
      最近更新 更多