【问题标题】:PHP - Best practice Global database variable in class (OOP) [duplicate]PHP - 最佳实践类中的全局数据库变量(OOP)[重复]
【发布时间】:2016-08-04 12:59:55
【问题描述】:

当您有多个具有查询方法的类时,关于访问数据库的“最佳实践”是什么?

全局$db变量:

$db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

class Item {
    private $id;

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

    public function remove() {
        global $db;

        // queries and stuff.
    }
}

或者,将$db 传递给构造函数?

$db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

$item = new Item(5,$db);

class Item {
    private $id;
    protected $db;

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

    public function remove() {
        // queries and stuff.
    }
}

或者也许另一种方式比这两种方式都更好?

【问题讨论】:

    标签: php class oop model-view-controller methods


    【解决方案1】:

    对于可以在任何地方使用的全局对象,我个人更喜欢单例类:

    class DBConnection {
    
         private static $instance = null;
    
         private $db;
         private function __construct() {
             $this->db = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
         }
    
         public static function getDB() {
               if (self::$instance === null) { 
                   self::$instance = new self();
               }
               return self::$instance->db;
         }    
    }
    

    这样你就可以在任何你需要的地方调用:DBConnection::getDB(),这也可以与自动加载一起使用。

    【讨论】:

      【解决方案2】:

      构造函数注入是更好的方法。该类明确指出,它需要访问数据库。从长远来看,这将有助于维护应用程序。您可以使用依赖注入容器(DI 或 IOC)来自动填充所需的服务。有许多关于在 PHP 中使用 deoendency injection 的优秀博客文章。 Symfony 文档很好地解释了这些好处。

      全局变量在 OOP 中被认为是不好的做法,应该完全省略。

      第三种可能性是使用单例(不被认为是最佳实践)或像旧 Laravel 版本那样的静态外观。静态立面是讨论的热门话题。你可以在 Laravel 文档中找到更多关于它们的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2019-12-19
        • 2013-06-19
        • 1970-01-01
        相关资源
        最近更新 更多