Как я должен использовать свой класс базы данных в другом классе? - PullRequest
0 голосов
/ 16 марта 2011

У меня есть один класс оболочки базы данных.Как мне использовать этот объект класса для выполнения запроса в другом классе?

$liveresellerdb=new Database('host','user','spswd','db');
$fetch = $liveresellerdb->getResult($select_resellerData);

Как мне включить объект базы данных в один мой класс?

Class one 
{
    function a (){
       $sql="select * from table ";
       //how should i execute here my query i mean to say 
       //every time i can't create the new object 
       // i want to know the good method by which i just execute the query by
       // giving the database name    
    }
}

Ответы [ 4 ]

3 голосов
/ 16 марта 2011

Я бы советовал не использовать шаблон Singleton (использование статических элементов является разновидностью этого шаблона) и вместо этого использовать Dependency Injection.Это означает, что вы передаете объект базы данных в службу (класс, который использует соединение) через конструктор.

Вот пример.

class UserFinder
{
    private $db;

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

    public function findAllActive()
    {
        $sql = 'SELECT * FROM users WHERE active = 1';

        return $this->db->executeAndFetchAll($sql);
    }
}

$db = new Database($host, ...);
$finder = new UserFinder($db);

$users = $finder->findAllActive();

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

Короче: используйте внедрение зависимостей.

2 голосов
/ 16 марта 2011

Может быть, вам следует подумать о реализации вашего Database класса в соответствии с Singleton Pattern .


Обновлено (согласно комментарию ниже):

Ok. У меня есть только одно предложение здесь (кроме передачи объекта через параметры метода и внедрение зависимостей, описанных в комментарии igorw ) ...

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

Таким образом, у вас будет только один публичный статический метод getInstance($key), а ключи могут быть сохранены как некоторые предопределенные константы (чтобы избежать ошибок в написании).

Таким образом, вам вообще не требуется инициализация (getInstance($key) может создавать новые объекты базы данных с необходимыми параметрами [передаются в конструктор] в зависимости от параметра $ key). Внедрение зависимостей в целом выглядит лучше, но в некоторых случаях этот способ может быть проще в использовании.

2 голосов
/ 16 марта 2011

Поскольку глобальные переменные являются грязными (вам всегда нужен оператор global $var;), самое простое решение - сохранить их в статическом члене класса, например, Database::$db.

Другим решением (в надлежащей среде ООП) будет передача экземпляра базы данных классам - в вашем коде это будет конструктор one, который принял бы экземпляр и затем сохранен в закрытой переменной-члене.

1 голос
/ 17 марта 2011

Может быть нормально иметь метод Db setAdapter, который хранит соединения с базой данных в статическом свойстве по имени:

Db::setAdapter('db1', 'mysql:host=localhost;dbname=' . $dbname, $user, $pass);
Db::setAdapter('db2', 'mysql:host=localhost;dbname=' . $dbname2, $user2, $pass2);

Затем метод getAdapter, который при необходимости возвращает соединение с базой данных:

Db::getAdapter(); // return the default one
Db::getAdapter('db2'); // return an instance by its name

За кулисами вы могли бы также реализовать ленивое соединение.

...