Использование связи с БД везде внутри PHP-приложения - PullRequest
1 голос
/ 30 марта 2012

У меня есть класс БД, который выглядит так

class db {

    protected $db;

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

    protected function connect() {
        $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error);
        $this->db->set_charset('utf8');
    }

}

Каждый класс в моем приложении PHP расширяет этот класс БДчто

class validation extends db {

    var $ajax, $common;

    function __construct() {
        parent::__construct();
...

Получение сообщения об ошибке «Слишком много подключений».Я чувствую, что это неправильный подход: я каждый раз воссоединяюсь с БД.Так что, на ваш взгляд, правильно?Можно ли определить ('db', ...) 1 раз и использовать везде внутри приложения?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

registration и validation являются классами, которые используют db, но не являются его подклассом.

Ваш код должен выглядеть следующим образом:

$db = new DB();
$db->connect();
$registration = new Registration($db);

class Registration {

    private $db;

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

Вы передаете ссылку на экземпляр $db всем классам, которые в ней нуждаются.

Причина, по которой вы открываете слишком много соединений, возможно, заключается в том, что в настоящее время каждый класс создает свое собственное подключение к вашей базе данныхи это не то, что вы хотите или должны делать.

0 голосов
/ 30 марта 2012

Вы хотите использовать композицию здесь.Также можно рассмотреть возможность изучения шаблона Singleton.

Чтобы уточнить, используя композицию, каждый класс в вашей библиотеке будет иметь экземпляр класса db, а не будет Экземпляр класса db.

Синглтон заставит класс db обеспечить выполнение только одного экземпляра класса, который полезен для общих ресурсов, таких как соединения с базой данных.Посмотрите эту ссылку для дальнейшего чтения по теме.

http://php.net/manual/en/language.oop5.patterns.php

РЕДАКТИРОВАТЬ: Добавление некоторого кода

Превращение класса БД в синглтон

<?php
class db
{
    static private $_oInstance = null;
    protected $db;

    private function __construct()
    {
        $this->connect();
    }

    static public function getInstance()
    {
        if(self::$_oInstance === null)
            self::$_oInstance = new db();
        return self::$_oInstance();
    }

    protected function connect()
    {
        $this->db = new MySQLi(db_host, db_user, db_pass, db_name) or die($this->db->error);
        $this->db->set_charset('utf8');
    }

}

Пересмотр остальных классов для создания экземпляра базы данных, а не для расширения класса базы данных

class registration
{
    private $_oDb;
    public $validation;

    function __construct()
    {
        parent::__construct();
        $this->_oDb = db::getInstance();
        $this->validation = new validation();
    }

    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...