2012-11-25 206 views
2

考虑下面的代码,我一直认为Lynda.com 创建一个这样的数据库类,我的问题是为什么不创建 一个数据库的静态方法,而不是存储 实例变成静态属性?静态方法vs静态实例

<?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(); 

?> 
+2

无论如何,它们都不好,因为它们会创建全局状态和隐式依赖关系,所以不要这样做。 – ChocoDeveloper

+2

该代码缺少'getInstance'上的'static'说明符。这被称为[单例模式](http://stackoverflow.com/questions/4595964/who-needs-singletons)。 – DCoder

+0

你确定*这是你的老师怎么说的吗?我闻到重要的细节缺失。 – goat

回答

2

如果你想使用单你应该保护__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个连接,你不应该!使用单身。

0

只是为了澄清,$db是一个数据库对象,这是通过调用静态方法getInstance()实例化。

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

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

如果您认为有必要,您可以将方法添加到Database类以与数据库进行交互。

+0

当我的意思是完全静态方法,为什么不创建一个静态方法,而不是一个构造函数的数据库连接。 –

1

我的猜测是你贴的代码的用意是以下因素,因为它看起来像它的用意是单身。我只更改了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(); 

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

如果不是希望成为一个单身,那么你的问题:“为什么他们不只是使用一个静态方法”应该有答案“就应该有”。