![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
sickoid |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.12.2009 Где: Киев Репутация: нет Всего: нет |
здравствуйте
![]() ООП в PHP изучаю недавно, поэтому, возможно, кому-то решение покажется очевидным, но я запутался, так что не пинайте ногами. название топика вышло не совсем информативным, так что конкретизирую. для начала в общих чертах опишу создаваемый проект, чтобы проще было понять, чего я хочу добиться. итак, это что-то типа каталога некоторого рода Объектов, понятное дело, имеющих определенные свойства (как простые текстовые, так и более сложные), которые надо записывать/считывать из базы данных. простейший класс для работы с базами (назовем его DB) написан без проблем. его должен использовать основной класс (назовем его Object). например, создавая новый экзмпляр класса:
мы подключаемся к базе данных, выбираем из нее запись с id равным $id и инициализируем полученными данными свойства объекта. аналогично при сохранении модифицированного объекта - пишем все в базу, апдейтя старые данные. кроме того, есть класс (назовем его Photo) для работы с фотографиями (позволяет легко получить имя автора, описание фото, генерирует код thumbnail'ов и прочие мелочи). все это он тоже считывает и записывает в БД. объекты типа Photo используются как сами по себе на сайте, так и как часть класса Object (одно из свойств класса - массив фотографий этого объекта). вроде бы, все предельно просто, но возник вопрос - как корректно организовать взаимодействие двух основных классов с классом для работы с БД? сначала я добавил в описания классов Object и Photo свойство $db, которое инициализировалось в конструкторах следующим образом:
а потом уже вся работа велась через это подключение. поначалу это работало, но по мере усложнения кода начинали появляться ошибки, выявить точную причину которых не так просто. кое что фиксилось, кое-что опять вылазило. но тут я понял, что заниматься лечением конкретных ошибок глупо, если сам подход идеологически неверный (или, по крайней мере, нерационален). в моем случае получается, что при создании одного объекта миллион раз открывается и закрывается подключение к серверу с базами (сначала для инициализации текстовых свойств, потом отдельно для каждой фотографии). молчу уже о ситуациях, когда надо создать много объектов в цикле. кроме того, на почве всей этой путаницы с открытиями/закрытиями подключений постоянно вылазят ошибки а-ля "mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost'", разбираться в которых очень напряжно. в общем, помогите организовать работу наиболее православно - чтобы подключение к базе происходило всего один раз вместо миллиона и не возникало ситуаций, когда подключение почему-то закрылось, а объект все равно делает запрос в рельсу. заранее спасибо ![]() |
||||
|
|||||
StachelDraht |
|
|||
![]() Не Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 19.1.2006 Репутация: 1 Всего: 1 |
у меня точно такой же вопрос, по этому если можно то покажите пожалуйста на примерах
Спасибо! |
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
класс DBConnector синглетоном.
В каждом классе получаете для удобства работы $this->db =& DBConnector::getInstance(); все, что нужно. Таким образом все православно и память не засираете дубликатами DB. Добавлено через 5 минут и 37 секунд Код паттерна синглетон не привожу, потому что это зависит от требований совместимости с разными версиями PHP. Посколько PHP - весьма калообразный язык, ООП в нем весьма калообразно и понятие классического паттерна "Синглетон" в 4-й версии PHP превращается в кал. Но некое подобие возможно. |
|||
|
||||
sickoid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.12.2009 Где: Киев Репутация: нет Всего: нет |
||||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
|
|||
|
||||
comcon1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Нет. Синглетон - это не статический класс. Синглетон - это класс, который инициализируется только один раз. То есть не может быть два объекта класса типа синглетон. Отличие от статического класса состоит в том, что здесь вы сами управляете временем инициализации класса, а в случае статического класса это будет зависить от того, как подключатся инклуды и прочая лабуда.
Я в проектах, кстати отдельный класс для работы с базой почему-то не юзаю. Но вот пример моего синглтона, который работает в PHP4 и PHP5:
Вот так можно теперь юзать где угодно. Ни одной копии класса в памяти не создастся, а сам конструктор запустится при первой инициализации.
|
||||
|
|||||
sickoid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.12.2009 Где: Киев Репутация: нет Всего: нет |
||||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
sickoid, несколько офтопик. Но
http://eugene.in.ua/ie.html найди того кто тебе делал сайт и вырви ему яйца ![]() По топику, для старта Синглтона будет достаточно. Когда вдруг появятся еще другие Синглтоны, то стоит освоить такие вещи как Factory/Registry/Locator и Dependency Injection |
|||
|
||||
sickoid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.12.2009 Где: Киев Репутация: нет Всего: нет |
оу, спасибо, завтыкал. переименовал файлик когда-то, а в редиректе забыл исправить. а яйца мне еще пригодятся, думаю ![]() и за совет по теме спасибо. |
|||
|
||||
Ипатьев |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2232 Регистрация: 5.7.2009 Репутация: 28 Всего: 37 |
оффтопик.
Пальцы, конечно, веером, и искрометно порассуждать о недостатках языков. А в коде у нас stripslashes($row->content); |
|||
|
||||
Simpliest |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
sickoid, я откровенно не знаю какой дурак тебя надоумил на это
![]() Но резать ВСЕ версии IE - не самый умный вариант ![]() Тем более что 7-8й версии оно работает практически без изменений. |
|||
|
||||
sickoid |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 21.12.2009 Где: Киев Репутация: нет Всего: нет |
б/м адекватен только 8й, да и то иногда исполняет. 7й - что-то среднее между ним и 6м. но вцелом, это идеологический момент, а не потому, что мне лень было завести отдельный css-файлик с дополнениями для IE. и абсолютно не вижу причин называть меня дураком, ибо это моя личная страница и мой выбор. сайты, за которые мне платят, открываются в эксплорере независимо от моего к нему отношения. зы. сейчас ворнов за оффтоп отхватим. |
|||
|
||||
LostAlly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 9.2.2007 Репутация: нет Всего: нет |
Всем здравствуйте.
Изучаю ООП на PHP, пишу абстрактный класс для работы с БД. И у меня возник примерно такой же вопрос как у автора. Вот только мне кажеться что синглтон не очень хороший выбор для решения данной задачи(если я вообще правильно понял принцип работы синглтона). Так вот если писать класс(или библиотеку классов) для работы с БД на основе парадигмы синглтона, может настать момент когда приложению использующему при написании синглтон придется подключиться одновременно к двум разным базам данных, в данной ситуации при использовании синглтона первое подключение будет сбрасываться. И чтобы уйти от синглтона, нам придется во первых переписать сам класс, а во вторых внести довольно много изменений (в том числе и структурных) в весь проект. Я прав? Если да, подскажите пожалуйста подход при котором не будет данного минуса. |
|||
|
||||
Simpliest |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 625 Регистрация: 1.9.2009 Репутация: 1 Всего: 3 |
Вот ответ
Впрочем, и в рамках Синглтона можно работать с несколькими подключениями. Надо всего лишь использовать
|
||||||
|
|||||||
segrey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 26.12.2006 Репутация: нет Всего: нет |
||||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |