返回实例变量V/s返回直接对象

Kar*_*rma 1 php static-members

我正在研究在2009年建立的网站的源代码,它是一个自定义框架.

有什么不同?

<?php
class DbAccess {

    private static $instance;

    /**
     * Returns the instance of the DB Class
     */

    public static function getInstance()
    {
        self::$instance = new DbAccess();
        return self::$instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

V /秒

<?php
class DbAccess {


    /**
     * Returns the instance of the DB Class
     */

    public static function getInstance()
    {
        return new DbAccess();
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经开发了几个定制的框架和一组具有不同模式的库,但有时,我看到返回实例的方法是通过self::$instance,有时,它直接返回通过new

哪个是好习惯?考虑即将推出的PHP版本.

Pee*_*Haa 5

在谈论OOP时,两者都不是好习惯.其他人已经指出的第一种方法看起来像有人试图实现单例模式而失败了.就OOP而言,单身人士有多糟糕.它引入了紧耦合,隐藏依赖和全局状态.基本上它是利用这样一种有趣的方式global关键字.

现在为你的第二个例子.具有完全相同的缺点基本上是相同的.

请注意,每次调用方法时,这两个示例都会创建一个新的数据库连接 哪个......不是最优的.

现在我要做的就是以下内容(使用依赖注入):

假设您有一些需要数据库访问的类,您可以执行以下操作:

class Foo
{
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function methodWhichNeedsDatabaseAccess()
    {
        // do something with $this->db
    }

}

// or whatever instance for database access you are using
$db = new PDO(dsn);
$foo = new Foo($db);
$foo->methodWhichNeedsDatabaseAccess();
Run Code Online (Sandbox Code Playgroud)