PHP - 最佳实践类中的全局数据库变量(OOP)

时间:2016-04-13 12:23:50

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

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

全球$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.
    }
}

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

2 个答案:

答案 0 :(得分:0)

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

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

第三种可能性是使用单例(不被认为是最佳实践)或使用旧版Laravel版本的静态外观。静态外墙是讨论中的热门话题。您可以在Laravel文档中找到更多相关内容。

答案 1 :(得分:0)

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

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(),这也适用于自动加载。