PDA

Просмотр полной версии : вопрос по архитектуре


[x26]VOLAND
21.11.2008, 10:13
Небольшой вопрос по архитектуре.
Всем известно, что классы должны быть максимально абстрагированы друг от друга.
Но в моём проекте есть несколько классов, которым требуется объект класса базы данных $db. Каким способом лучше вносить объект $db в эти классы?

Принимать объект $db в качестве агрумента конструктора инстанцируемого класса (с последующим занесением его в отдельное свойство класса) непрактично.

Вносить его ссылочной функцией (которая реализует синглтон) в каждый метод нужного класса - тоже не дело. (и тем более, боже упаси, global'ом)

Наследование нужными классами классa DB - тоже не дело....

Какие ещё варианты посоветуете.

Sharky
21.11.2008, 14:47
а почему ты против global? 0_o

[x26]VOLAND
21.11.2008, 15:00
а почему ты против global? 0_oC твоими познаниями построения архитекры приложений тебе нечего делать в этой теме.

Pashkela
21.11.2008, 15:01
Если я правильно понял вопрос в принципе вообще, то может быть это поможет:

db.php


switch($dbms)
{
case 'mysql':
include($phpbb_root_path . 'db/mysql.'.$phpEx);
break;

case 'mysql4':
include($phpbb_root_path . 'db/mysql4.'.$phpEx);
break;

case 'postgres':
include($phpbb_root_path . 'db/postgres7.'.$phpEx);
break;

case 'mssql':
include($phpbb_root_path . 'db/mssql.'.$phpEx);
break;

case 'oracle':
include($phpbb_root_path . 'db/oracle.'.$phpEx);
break;

case 'msaccess':
include($phpbb_root_path . 'db/msaccess.'.$phpEx);
break;

case 'mssql-odbc':
include($phpbb_root_path . 'db/mssql-odbc.'.$phpEx);
break;
}

[x26]VOLAND
21.11.2008, 15:04
Нет слов. Пожалуйста, те кто ничего не понимает в данной теме, не пишите тут.

MuXaJIbI4
21.11.2008, 15:04
extends чем не устраивает?

GreenBear
21.11.2008, 15:04
чем тебе не устраивает мой вариант с общим конструктором?

Dian
22.11.2008, 04:11
Вносить его ссылочной функцией (которая реализует синглтон) в каждый метод нужного класса - тоже не дело. (и тем более, боже упаси, global'ом)
На самом деле все не так мрачно. Вполне можно пользовать синглтон (сохранять в поле класса), либо даже глобальный объект - просто это нужно закатать в базовый класс.
Ориентируйся на удобство использования: видимо, должно быть $db-> и сразу то, что нужно

nerezus
22.11.2008, 19:19
Ой блин... паттерн Registry.
Если объект один, то паттерн Singleton.

P.S. Zend_Registry юзай.

[x26]VOLAND
23.11.2008, 06:28
Ой блин... паттерн Registry.Вопрос немного в другом. Я ищу способ обращения к классам (не важно где они хранятся и чем управляются)

nerezus
23.11.2008, 12:51
Ну чререз Registry обращайся к ним.
Прогугли на этот паттерн - это я тоже должен заставлять?

[x26]VOLAND
23.11.2008, 16:58
Ну чререз Registry обращайся к ним.
Прогугли на этот паттерн - это я тоже должен заставлять?Ты опять не понял. Регистри я умею использовать. Внимательно перечитай мой вопрос.
"....обращайся к ним..." Как раз таки способ обращения к ним меня и интересует...


class myClass
{
function myMethod()
{
$db = Registry::get('DB')
.....
}
....
}



class myClass
{
var $db;
function __construct(db $DB)
{
$this->db = &$DB;
}
....
}
$myObj = new newClass(Registry::get('DB'));

Вот примеры таких способов. Меня интересует наиболее выгодный как с точки зрения производительности и использования памяти; удобства; так и максимально правильной реализации паттерна Low Coupling.

nerezus
24.11.2008, 01:15
Ну еще раз прочитай )
Регистри нужен для первого способа. Во втором он нах не нужен, можно обычной переменной обойтись)