Использование моего класса базы данных с другими классами в моем проекте - PullRequest
3 голосов
/ 29 августа 2010

У меня есть собственный класс базы данных, который я написал сам, а также у меня есть класс пользователя и класс сайта.

Класс MySQL имеет такие методы:

connect
query
clean
fetch

Класс пользователя:

register
login
logout
resetPass

Класс сайта:

updateTopics
addTopic
addPost
addReply

и т.д.

Эти классы должны взаимодействовать с базой данных, для чего я написал класс MySQL. Но я понятия не имею, как правильно использовать класс MySQL с этими классами. Определить ли класс как глобальный и просто ссылаться на него в других классах? Должен ли я сделать что-то вроде:

$db = new MySQL();
$user = new User($db);

а потом ссылаться на это так?

Любая помощь приветствуется, спасибо. :)

Ответы [ 3 ]

3 голосов
/ 29 августа 2010

В дополнение к ответу Даниэля Вандерслёйса: Создание объекта внутри вашего класса создает сильную зависимость между этими классами. Вместо этого вас может заинтересовать внедрение зависимостей и инверсия управления (+ ioc контейнеры).

см
http://en.wikipedia.org/wiki/Dependency_injection
http://martinfowler.com/articles/injection.html


Кстати: вам действительно нужна ваша собственная реализация класса MySQL? Уже есть так много доступных уровней доступа к базе данных и абстракции. Например. http://docs.php.net/pdo.

1 голос
/ 29 августа 2010

Вас может заинтересовать проверка класса MySql только один раз. Это предотвращает многократное открытие и закрытие соединения во время выполнения. Мне нравится использовать концепцию Фабрики. это класс, который обрабатывает создание экземпляров объектов, и вы можете написать его, чтобы разрешить только один экземпляр, следуя концепции Singleton.

что-то вроде этого:

class Factory {

    private static $objects = array();

    static function get_database() {

        if( ! isset(self::$objects['database']))
            self::$objects['database'] = new MySql();

        return self::$objects['database'];
    }
}

вы бы использовали так:

$db = Factory::get_database();

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

хорошо, но это просто очень простая реализация Фабрики, просто для понимания. это может быть намного лучше =]

0 голосов
/ 29 августа 2010

Вы можете создать экземпляр своего MySQL класса в других классах, например:

class User
{
  private $db;

  function __construct(...)
  {
    $this->db = new MySQL();
  }

  function accesses_database(...)
  {
    $this->db->query(...);
  }
}

И затем ссылаться на $this->db внутри своего класса, когда вы хотите получить доступ к базе данных.

Кроме того, если вы хотите, чтобы был только один экземпляр MySQL, вы можете сделать его singleton .

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