вопрос по архитектуре

Discussion in 'PHP' started by [х26]VОLАND, 21 Nov 2008.

  1. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Небольшой вопрос по архитектуре.
    Всем известно, что классы должны быть максимально абстрагированы друг от друга.
    Но в моём проекте есть несколько классов, которым требуется объект класса базы данных $db. Каким способом лучше вносить объект $db в эти классы?

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

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

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

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

    Sharky Elder - Старейшина

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    а почему ты против global? 0_o
     
  3. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    C твоими познаниями построения архитекры приложений тебе нечего делать в этой теме.
     
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Если я правильно понял вопрос в принципе вообще, то может быть это поможет:

    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;
    }

     
  5. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Нет слов. Пожалуйста, те кто ничего не понимает в данной теме, не пишите тут.
     
  6. MuXaJIbI4

    MuXaJIbI4 Member

    Joined:
    20 Nov 2008
    Messages:
    66
    Likes Received:
    7
    Reputations:
    0
    extends чем не устраивает?
     
  7. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    чем тебе не устраивает мой вариант с общим конструктором?
     
    1 person likes this.
  8. Dian

    Dian Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    57
    Likes Received:
    11
    Reputations:
    4
    На самом деле все не так мрачно. Вполне можно пользовать синглтон (сохранять в поле класса), либо даже глобальный объект - просто это нужно закатать в базовый класс.
    Ориентируйся на удобство использования: видимо, должно быть $db-> и сразу то, что нужно
     
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Ой блин... паттерн Registry.
    Если объект один, то паттерн Singleton.

    P.S. Zend_Registry юзай.
     
  10. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Вопрос немного в другом. Я ищу способ обращения к классам (не важно где они хранятся и чем управляются)
     
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Ну чререз Registry обращайся к ним.
    Прогугли на этот паттерн - это я тоже должен заставлять?
     
  12. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Ты опять не понял. Регистри я умею использовать. Внимательно перечитай мой вопрос.
    "....обращайся к ним..." Как раз таки способ обращения к ним меня и интересует...

    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.
     
    #12 [х26]VОLАND, 23 Nov 2008
    Last edited: 23 Nov 2008
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Ну еще раз прочитай )
    Регистри нужен для первого способа. Во втором он нах не нужен, можно обычной переменной обойтись)