вопросы по паттернам

cDLEON

Онанист РНРСlub
меня бесит бессмысленный повторяемый код.
Я не вижу ни чего бессмысленного и повторяющегося в $this->get_database(). Напротив - мы ограничиваем себя от глобальных переменных. И мы, в тоже время, можем просто переопределить этот метод не затрагивая реализацию выше.
 

Фанат

oncle terrible
Команда форума
но вот как пойдут mixin и dependancy injection? - не уверен, что хорошо
Если это класс для работы с БД, то куда его примешивать? Это совершенно отдельная сущность.
получил свои данные,
PHP:
$data = db::getAll("SELECT * FROM news WHERE type=?",$type);
и дальше примешивай их куда угодно.
Это статический класс, работает сразу по вызову. Он по определению injection independent.
или я чего-то глобально не понимаю.

Кстати, Redjik тебе нотификация на форуме просигналила, что я сейчас твой пост процитировал? Мне жутко интересно, работает ли она при редактировании поста, или только при создании.
 

Вурдалак

Продвинутый новичок
не понял. почему один и тот же?
Тебе придётся заводить под каждый инстанс свою static-переменную внутри каждого класса, наследуемого от db, не суть.

Из каких это таких труднодоступных мест ты запрашиваешь каждый раз db, что нельзя один раз дописать
PHP:
$this->db = ...;
и пользоваться этим инстансом?
 

fixxxer

К.О.
Партнер клуба
Вурдалак
Вот, да. Синглтоны и прочие реестры тем и нехороши, что позволяют дернуть что угодно где угодно.
 

WMix

герр M:)ller
Партнер клуба
Singleton
я как разработчик хочу быть уверен или даже гарантирую что существует всего одна инстанция класса.
про базы данных это неправда, раньше можно было иметь доступ только к одной базе данных но сейчас никто не мешает иметь две инстанции
на две различные базы..
красивый пример синглетона это актуальный пользователь, он действительно может быть только 1!
 

WMix

герр M:)ller
Партнер клуба
вообще наверно фанат прав, вы както поверхносно смотрите на патерны, важно не как их делать а где это применяется, важно описать не фабричный метод, а программу которая работает с фабричными методами в смысле, если я знаю что это инстанция класса фабрики, то я уверен что там есть функция дай обьект!.. и только синглтон исключение из этого правила
 

WMix

герр M:)ller
Партнер клуба
есть такая игра шахматы,
есть некий класс фигура, обьект которой является прототипом всех фигур и имеет абстрактную фабрику порождающую нужную мне фигуру.
доска шахмат реализована композицией из полей и фигур, каждый ход в этой игре это стратегия, непонятно будет ли передвинута фигура, убита другая, рокировка или переход через рубленное поле, в игру играют 2 пользователя которые являются наблюдателями, каждый должен узнать как сходил другой. ну и все это запускается через единственный метод типа фасад
 

Absinthe

жожо
А разве не проще использовать просто $this->db?
Ведь весь код относительно БД лежит в моделях. Следовательно нам не нужно пропихивать db в кучу мест или делать ее синглтоном для дальнейшего получения. Достаточно 1 раз пропихнуть ее в базовый класс модели.
 

WMix

герр M:)ller
Партнер клуба
а почему ты считаешь что модель только для одной базы данных? почему я не могу использывать туже самую модель для 2 различных баз с одинаковой таблицей? и походу выполнения порою переключаться с одной базы на другую... вот тут и $this->db вспомниться
 

WMix

герр M:)ller
Партнер клуба
а ну а тогда какое сокращение от $this->db ? не проще ли сразу писать $this->getConnection() ?
или имеется в виду__get() ?
 

Absinthe

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

почему я не могу использывать туже самую модель для 2 различных баз с одинаковой таблицей?
Я не могу представить задачу, где нужно работать с 2 одинаковыми таблицами в разных базах, чтобы основной сущностью была запись.
 

WMix

герр M:)ller
Партнер клуба
но тебе придеться и $model->db переписать из контроллера, а если это 20 моделей то 20 раз... и конечно она будет знать с каким соеденением...
а можно и проще всего один раз в данном случае setConnection( new Connection(xyz))
 

Absinthe

жожо
но тебе придеться и $model->db переписать из контроллера, а если это 20 моделей то 20 раз... и конечно она будет знать с каким соеденением...
Давай не будем фантазировать, развивая эту идею. Все зависит от реализации, и я не вижу проблем сделать эту реализацию нормальной.
 

WMix

герр M:)ller
Партнер клуба
просто спрятав $this->db за методом мы решим и то что модель знает какое соеденение, и то что оно от обьекта к обьекту отличное, а вот с $this->db несколько сложнее... но в пхп всегда есть магический метод __get и он сделает как дклаешь ты то о чем говорю я... действительно спор бессмысленный
 

fixxxer

К.О.
Партнер клуба
WMix
у меня примерно так
Код:
Model {
   getDb() {
       if (null === $this->Db) {
           $this->Db = $this->getDefaultConnection()
       }
       return $this->Db
   }
   setConnection($Db)
}
 

WMix

герр M:)ller
Партнер клуба
а я зенд узаю, там так

PHP:
$this->getAdapter()->fetchAll(
  $this->getAdapter->select()->from($table,$fields_arr)->where('xyz=?', $xyz)->...
);
Absinthe
Я не могу представить задачу, где нужно работать с 2 одинаковыми таблицами в разных базах, чтобы основной сущностью была запись.
на скидку, бакапы, разделенные социальные сети... и чисто из опыта, у нас был оракл с огромной базой продуктов, предложений, магазинов 5 мио продуктов 50 мио предложений,... нужно было разделить на 3 базы, картинки и все что с ними связанное уходили в базу для тула с картинками для графикеров(теже продукты, но пофиг какие предложения), предложения уходили в статистику, теже предложения но так пофиг какие картинки или товары с точки зрения описания.. а контент собирали в монго... там пофиг до предложений картинок, чисто аттрибуты продуктов и описания...

таблицы совершенно одинаковые, кроме что гдет нужно было инфу терминировать какойто логикой
 
Сверху