Небольшой вопрос по архитектуре. Всем известно, что классы должны быть максимально абстрагированы друг от друга. Но в моём проекте есть несколько классов, которым требуется объект класса базы данных $db. Каким способом лучше вносить объект $db в эти классы? Принимать объект $db в качестве агрумента конструктора инстанцируемого класса (с последующим занесением его в отдельное свойство класса) непрактично. Вносить его ссылочной функцией (которая реализует синглтон) в каждый метод нужного класса - тоже не дело. (и тем более, боже упаси, global'ом) Наследование нужными классами классa DB - тоже не дело.... Какие ещё варианты посоветуете.
Если я правильно понял вопрос в принципе вообще, то может быть это поможет: 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; }
На самом деле все не так мрачно. Вполне можно пользовать синглтон (сохранять в поле класса), либо даже глобальный объект - просто это нужно закатать в базовый класс. Ориентируйся на удобство использования: видимо, должно быть $db-> и сразу то, что нужно
Вопрос немного в другом. Я ищу способ обращения к классам (не важно где они хранятся и чем управляются)
Ты опять не понял. Регистри я умею использовать. Внимательно перечитай мой вопрос. "....обращайся к ним..." Как раз таки способ обращения к ним меня и интересует... 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.
Ну еще раз прочитай ) Регистри нужен для первого способа. Во втором он нах не нужен, можно обычной переменной обойтись)