【问题标题】:Static Method vs Static Instances静态方法与静态实例
【发布时间】:2012-11-12 23:46:32
【问题描述】:

考虑下面的代码,我已经被 Lynda.com 认为 要创建这样的数据库类,我的问题是为什么不创建 完全用于数据库的静态方法,而不是存储 实例化为静态属性?

<?php
class Database {

  private $conn;
  private static $init;

  public function __construct() {
     $this->conn = new mysqli('localhost','root','root','mydb');
  }

  public static function getInstance() {
     self::$init = new self();
     return self::$init;
  }

}

$db = Database::getInstance();

?>

【问题讨论】:

  • 反正两者都不好,因为它们会创建全局状态和隐式依赖,所以不要这样做。
  • 该代码在getInstance 上缺少static 说明符。这称为singleton pattern
  • 确定这是你老师说的吗?我闻到缺少重要的细节。
  • 您应该首先问:“为什么不直接创建Mysqli 数据库类的对象实例并传递它呢?” 构造函数中的 new 只是为了分配它以后静态访问的变量?没有多大意义。
  • 除非你知道你需要它,否则不要使用?&gt;(删除它)。

标签: php mysql oop mysqli


【解决方案1】:

如果你想使用单例,你应该保护 __construct()

class DB
{
  private static $instance;

  private function __construct($args)
  {
    // do some
  }

  public static function getInstance()
  {
    // get instance
  }
}

$query = 'SELECT etc...';
$stmt = DB::getInstance()->prepare($query);

我在 DB 类中使用这种模式。但是,如果您有超过 1 个连接,则不应该!使用单例。

【讨论】:

    【解决方案2】:

    我的猜测是您发布的代码是为了如下,因为它看起来像是一个单例。我只更改了getInstance() 方法。

    class Database {
    
      private $conn;
      private static $init;
    
      public function __construct() {
         $this->conn = new mysqli('localhost','root','root','mydb');
      }
    
      public static function getInstance() {
         if (is_null(self::$init)) {
             self::$init = new self();
         }
         return self::$init;
      }
    
    }
    
    $db = Database::getInstance();
    

    我认为这应该澄清为什么使用静态实例变量的困惑。

    如果这不是单例,那么“他们为什么不使用静态方法”的问题应该得到“他们应该有”的答案。

    【讨论】:

      【解决方案3】:

      澄清一下,$db是一个Database对象,通过调用静态方法getInstance()来实例化。

      为什么不完全为数据库创建一个静态方法?

      静态方法是在类中定义的,但是可以在无需实例化类的情况下调用它。换句话说,静态方法属于类,因为可以在不实例化对象的情况下调用 in。

      您可以根据需要向 Database 类添加方法以与数据库进行交互。

      【讨论】:

      • 当我完全是指静态方法时,为什么不在静态方法而不是构造函数中创建数据库连接。
      猜你喜欢
      • 1970-01-01
      • 2018-09-10
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2011-03-02
      相关资源
      最近更新 更多