【问题标题】:PHP The reason of make an get_instance method in a classPHP 在类中创建 get_instance 方法的原因
【发布时间】:2013-12-28 13:49:58
【问题描述】:

我有一个小问题,我认为这是一个愚蠢的问题。 我开始编写 OOP 代码,我在互联网上看到很多类都有这段代码:

public static $istance;
public function __construct(){
  //some code...
  $this->instance = $this;
}
public function get_instance(){
  return $this->instance;
}

我的问题是:原因是什么?

【问题讨论】:

  • 我觉得它像一种设计模式
  • 这段代码的主要原因是面向对象编程工具中的全局状态的鞋拔。这就是为什么单例是一种已知的反模式。请不要使用它。 永远

标签: php class oop instance


【解决方案1】:

这是单例http://en.wikipedia.org/wiki/Singleton_pattern的糟糕实现。

简而言之:单例是一种设计模式,它保证单线程应用程序将是具有全局访问点的类的唯一实例。

正确的实现

 class Singleton {
     protected static $instance;
     private function __construct(){ /* ... @return Singleton */ }
     private function __clone()    { /* ... @return Singleton */ } 
     private function __wakeup()   { /* ... @return Singleton */ }  
     public static function getInstance()  {
         if ( !isset(self::$instance) ) {
             self::$instance = new self();
         }
         return self::$instance;
     }
     public function doAction() { /* ... */ }
  }

调用实例

  Singleton::getInstance()->doAction();

【讨论】:

    【解决方案2】:

    虽然您提供的代码 sn-p 的上下文对我来说不是很清楚,但看起来他们正在在那段代码中实现 单例模式

    如果您想了解更多关于单例模式的一般信息,请查看here

    可以在此处找到示例implementation of singleton pattern in PHP

    这种模式的本质是什么?

    在设计 Web 应用程序时,通常在概念和架构上允许访问特定类的一个且仅一个实例是有意义的。单例模式使我们能够做到这一点。

    【讨论】:

      【解决方案3】:

      它看起来像Singleton pattern。它确保我们只有一个类的实例。

      但是,一般来说构造函数是private,以防止客户端自己创建新实例。

      【讨论】:

        【解决方案4】:

        我认为你在这里得到的是单例模式。您示例的“某些代码”部分将首先检查是否存在已经实例化的现有类。 get 实例中的代码将首先在构造中检查类。

            if ($this->instance === null) {
                $this->instance = new YourClass();
            }
            return $inst;
        

        这种模式已被广泛过度使用,但它对于数据库连接很有用,例如,您一次只希望一个连接实例浮动。将此与可以生成多个对象的工厂模式进行对比。

        【讨论】:

          猜你喜欢
          • 2021-10-25
          • 1970-01-01
          • 1970-01-01
          • 2022-08-16
          • 2012-06-14
          • 2013-03-01
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多