Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   вопрос по архитектуре (https://forum.antichat.xyz/showthread.php?t=92815)

[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_o
C твоими познаниями построения архитекры приложений тебе нечего делать в этой теме.

Pashkela 21.11.2008 15:01

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

db.php

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 обращайся к ним.
Прогугли на этот паттерн - это я тоже должен заставлять?
Ты опять не понял. Регистри я умею использовать. Внимательно перечитай мой вопрос.
"....обращайся к ним..." Как раз таки способ обращения к ним меня и интересует...

PHP код:

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


PHP код:

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

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


Время: 21:01