Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация классов, использующих подключение к БД, скорее теоретический вопрос 
:(
    Опции темы
sickoid
  Дата 14.1.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2009
Где: Киев

Репутация: нет
Всего: нет



здравствуйте smile

ООП в PHP изучаю недавно, поэтому, возможно, кому-то решение покажется очевидным, но я запутался, так что не пинайте ногами. название топика вышло не совсем информативным, так что конкретизирую.

для начала в общих чертах опишу создаваемый проект, чтобы проще было понять, чего я хочу добиться. итак, это что-то типа каталога некоторого рода Объектов, понятное дело, имеющих определенные свойства (как простые текстовые, так и более сложные), которые надо записывать/считывать из базы данных.

простейший класс для работы с базами (назовем его DB) написан без проблем. его должен использовать основной класс (назовем его Object). например, создавая новый экзмпляр класса:
Код
$obj=new Object($id);

мы подключаемся к базе данных, выбираем из нее запись с id равным $id и инициализируем полученными данными свойства объекта. аналогично при сохранении модифицированного объекта - пишем все в базу, апдейтя старые данные.

кроме того, есть класс (назовем его Photo) для работы с фотографиями (позволяет легко получить имя автора, описание фото, генерирует код thumbnail'ов и прочие мелочи). все это он тоже считывает и записывает в БД.

объекты типа Photo используются как сами по себе на сайте, так и как часть класса Object (одно из свойств класса - массив фотографий этого объекта).

вроде бы, все предельно просто, но возник вопрос - как корректно организовать взаимодействие двух основных классов с классом для работы с БД? сначала я добавил в описания классов Object и Photo свойство $db, которое инициализировалось в конструкторах следующим образом:
Код
$this->db=new DB();

а потом уже вся работа велась через это подключение. поначалу это работало, но по мере усложнения кода начинали появляться ошибки, выявить точную причину которых не так просто. кое что фиксилось, кое-что опять вылазило. но тут я понял, что заниматься лечением конкретных ошибок глупо, если сам подход идеологически неверный (или, по крайней мере, нерационален). в моем случае получается, что при создании одного объекта миллион раз открывается и закрывается подключение к серверу с базами (сначала для инициализации текстовых свойств, потом отдельно для каждой фотографии). молчу уже о ситуациях, когда надо создать много объектов в цикле. кроме того, на почве всей этой путаницы с открытиями/закрытиями подключений постоянно вылазят ошибки а-ля "mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost'", разбираться в которых очень напряжно.

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

заранее спасибо smile 
PM MAIL WWW GTalk   Вверх
StachelDraht
Дата 14.1.2010, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 19.1.2006

Репутация: 1
Всего: 1



у меня точно такой же вопрос, по этому если можно то покажите пожалуйста на примерах

Спасибо!
PM MAIL   Вверх
comcon1
Дата 14.1.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



класс DBConnector синглетоном. 

В каждом классе получаете для удобства работы

$this->db =& DBConnector::getInstance();

все, что нужно. Таким образом все православно и память не засираете дубликатами DB.

Добавлено через 5 минут и 37 секунд
Код паттерна синглетон не привожу, потому что это зависит от требований совместимости с разными версиями PHP. Посколько PHP - весьма калообразный язык, ООП в нем весьма калообразно и понятие классического паттерна "Синглетон" в 4-й версии PHP превращается в кал. Но некое подобие возможно.


--------------------
PM MAIL   Вверх
sickoid
Дата 14.1.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2009
Где: Киев

Репутация: нет
Всего: нет



Цитата(comcon1 @  14.1.2010,  20:48 Найти цитируемый пост)
класс DBConnector синглетоном. 

не могли бы вы кинуть линк на пример? "синглетон" - это полностью статический класс?
PM MAIL WWW GTalk   Вверх
nerezus
Дата 14.1.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

не могли бы вы кинуть линк на пример?
 В гугле забанили? По первой же ссылке отличная статья с примером на PHP.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
comcon1
Дата 14.1.2010, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Нет. Синглетон - это не статический класс. Синглетон - это класс, который инициализируется только один раз. То есть не может быть два объекта класса типа синглетон. Отличие от статического класса состоит в том, что здесь вы сами управляете временем инициализации класса, а в случае статического класса это будет зависить от того, как подключатся инклуды и прочая лабуда.

Я в проектах, кстати отдельный класс для работы с базой почему-то не юзаю.

Но вот пример моего синглтона, который работает в PHP4 и PHP5:
Код

<?php 

# Resources plugin for obtaining some text information
# from databases, like contacts, strings and usual text-blocks
#

class Resources {
    var $data = array();

    function Resources() {
        global $TABLE_RESOURCE, $TABLE_RESOURCE_LANGS, $WWWHOST, $TEMPLATE, $LangId;
        $q = 
          " SELECT r1.*, r2.content FROM $TABLE_RESOURCE r1 ".
          " LEFT JOIN $TABLE_RESOURCE_LANGS r2 ON r1.id = r2.item_id AND r2.lang_id='".$LangId."' ";
        $res = mysql__query($q, __CLASS__);
        $this->data = array();
        while ($row = mysql_fetch_object($res) ) {
            $this->data[$row->name] = $row;
            $this->data[$row->name]->content = 
                str_replace(
                    array("{TEMPLATE_URL}"),
                    array($WWWHOST.'templates/'.$TEMPLATE),
                    $row->content
                );
            $this->data[$row->name]->src = stripslashes($row->content);
            $this->data[$row->name]->title = stripslashes($row->title);
            $this->data[$row->name]->item_id = (int)$row->id;
        }
        mysql_free_result($res);
    }

    function &getInstance() {
        static $pthis;
        if (!isset($pthis)) {
            $pthis = new Resources();
        }
        return $pthis;
    }

    function get($name) { return stripslashes($this->data[$name]->content); }
    
    function init() {;}
}


?>



Вот так можно теперь юзать где угодно. Ни одной копии класса в памяти не создастся, а сам конструктор запустится при первой инициализации. 
Код

<?php
$plgR =& Resources::getInstance();
?>



--------------------
PM MAIL   Вверх
sickoid
Дата 14.1.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2009
Где: Киев

Репутация: нет
Всего: нет



Цитата(nerezus @  14.1.2010,  21:01 Найти цитируемый пост)
В гугле забанили?

все хорошо, не горячись smile


comcon1, спасибо большое. сходу в детали пока не въехал, но общий принцип теперь ясен - буду копать.
PM MAIL WWW GTalk   Вверх
Simpliest
Дата 14.1.2010, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



sickoid, несколько офтопик. Но
http://eugene.in.ua/ie.html
найди того кто тебе делал сайт и вырви ему яйца smile Или зажми в дверь и не отпускай, пока не переделает.

По топику, для старта Синглтона будет достаточно. Когда вдруг появятся еще другие Синглтоны, то стоит освоить такие вещи как Factory/Registry/Locator и Dependency Injection


--------------------
user posted image
PM   Вверх
sickoid
Дата 15.1.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2009
Где: Киев

Репутация: нет
Всего: нет



Цитата(Simpliest @ 14.1.2010,  21:46)
sickoid, несколько офтопик. Но
http://eugene.in.ua/ie.html
найди того кто тебе делал сайт и вырви ему яйца smile Или зажми в дверь и не отпускай, пока не переделает.

оу, спасибо, завтыкал. переименовал файлик когда-то, а в редиректе забыл исправить. а яйца мне еще пригодятся, думаю smile

и за совет по теме спасибо.
PM MAIL WWW GTalk   Вверх
Ипатьев
Дата 15.1.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



оффтопик.
Пальцы, конечно, веером, и искрометно порассуждать о недостатках языков.
А в коде у нас stripslashes($row->content);
PM MAIL   Вверх
Simpliest
Дата 15.1.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



sickoid, я откровенно не знаю какой дурак тебя надоумил на это smile
Но резать ВСЕ версии IE - не самый умный вариант smile
Тем более что 7-8й версии оно работает практически без изменений.


--------------------
user posted image
PM   Вверх
sickoid
Дата 15.1.2010, 18:24 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.12.2009
Где: Киев

Репутация: нет
Всего: нет



Цитата(Simpliest @  15.1.2010,  16:02 Найти цитируемый пост)
Тем более что 7-8й версии оно работает практически без изменений. 

б/м адекватен только 8й, да и то иногда исполняет. 7й - что-то среднее между ним и 6м. но вцелом, это идеологический момент, а не потому, что мне лень было завести отдельный css-файлик с дополнениями для IE. и абсолютно не вижу причин называть меня дураком, ибо это моя личная страница и мой выбор. сайты, за которые мне платят, открываются в эксплорере независимо от моего к нему отношения.

зы. сейчас ворнов за оффтоп отхватим.
PM MAIL WWW GTalk   Вверх
LostAlly
Дата 19.1.2010, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2007

Репутация: нет
Всего: нет



Всем здравствуйте.

Изучаю ООП на PHP, пишу абстрактный класс для работы с БД. И у меня возник примерно такой же вопрос как у автора.

Вот только мне кажеться что синглтон не очень хороший выбор для решения данной задачи(если я вообще правильно понял принцип работы синглтона). Так вот если писать класс(или библиотеку классов) для работы с БД на основе парадигмы синглтона, может настать момент когда приложению использующему при написании синглтон придется подключиться одновременно к двум разным базам данных, в данной ситуации при использовании синглтона первое подключение будет сбрасываться. И чтобы уйти от синглтона, нам придется во первых переписать сам класс, а во вторых внести довольно много изменений (в том числе и структурных) в весь проект.

Я прав?

Если да, подскажите пожалуйста подход при котором не будет данного минуса.
PM MAIL ICQ   Вверх
Simpliest
Дата 19.1.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(LostAlly @  19.1.2010,  20:32 Найти цитируемый пост)
Если да, подскажите пожалуйста подход при котором не будет данного минуса. 

Вот ответ
Цитата(Simpliest @  14.1.2010,  20:46 Найти цитируемый пост)
Когда вдруг появятся еще другие Синглтоны, то стоит освоить такие вещи как Factory/Registry/Locator и Dependency Injection 


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

static public $_connectionList = array();





--------------------
user posted image
PM   Вверх
segrey
Дата 19.1.2010, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 26.12.2006

Репутация: нет
Всего: нет



Цитата(comcon1 @  14.1.2010,  19:02 Найти цитируемый пост)
Но вот пример моего синглтона, который работает в PHP4 и PHP5

Таким примером только новичков распугивать. Непонятный кусок кода неудачной реализации модели из непонятного проекта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.