Русский English Deutsch Українська Қазақша

Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не вошли.

#1 2008-12-01 21:01:14

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Вопросы по ООП

в общем вопрос такой
есть 2 класса
1ый для работы с бд(любой SQL)
2ой для юзверя
суть вопроса

суть вопроса примерно такая на примере кода

<?php
$db = new db(); //соединилися с мускулем
$user = new user(); //создали юзверя по умолчанию тип гость
$user -> new_user(тут данные из формы) // типа регистрируем нового юзверя там логин пароль и прочие данные

во время выполнения
$user -> new_user();
в методе new_user я должен отправить запрос SQL типа insert into и типа того в бд
но вот собственно вопрос такой мне же получаеться надо будет что ли сделать $db= new db; внутри метода new_user или как то по другому могу отправить запрос в бд через класс db
для наглядности в классе db есть такой метод который получает ассоциативный двумерный массив с запросами к бд
типа что надо сделать (insert) куда и каким полям какие значения
но как мне обратиться из одного класса к другому не создавая экземпляра класса внутри метода для отправки SQL запроса в нужное соединение с бд?
надеюся правильно обьяснил?


senior php and js developer

Вне форума

#2 2008-12-01 22:05:55

vitaly
Администратор
Откуда: Россия
Здесь с 2008-10-08
Сообщений: 2,788
Рейтинг :   115 

Re: Вопросы по ООП

Есть несколько способов:
1. Кросс-обращения через глобальные переменные (очень плохо, но использовать можно).
2. Использование отдельного конфигурационного объекта, через который и будут общаться все твои объекты. Вполне жизнеспособный вариант, в некоторых случаях - самый подходящий способ. Причём возможны вариации - класс может использовать не только как обычный конфигуратор, но и как ядро системы, а остальные классы (db, user) могут выступать в качестве "навеса" (расширения функционала).

class configurator {
 function setDbConnect($dbConnect) { $this->dbConnect = $dbConnect; }
 function setUserConnect($userConnect) { $this->userConnect = $userConnect; }
 function getDbConnect() { return $this->dbConnect; }
 function getUserConnect() { return $this->userConnect; }
}

class user {
 function user($config) { $this->configLink = $config; }
 function new_user($params) {
  $db = $this->config->getDbConnect();
  $db->select(...);
 }
}

$config = new configurator();
$user = new user($config);
$db = new db($config);

3. Самый простой, но оптимальный для несложных задач - в конструктор класса user передавать ссылку на объект класса db:

class user {
 function user($dbConnect) {
  $this->dbConnect = $dbConnect;
 }
 function newUser($params) {
  // обращение к классу работы с БД
  $this->dbConnect->select(....);
 }
}

4. ... другие варианты ... :)

Вне форума

#3 2008-12-01 23:11:01

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Вопросы по ООП

вот задача так задача)


senior php and js developer

Вне форума

#4 2008-12-01 23:12:03

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Вопросы по ООП

либо попробывать таким образом
return от юзверя SQL запрос и его уже постить через класс в бд...оО но опять же получать ответ тоже не ахти получаеться((( чорд


senior php and js developer

Вне форума

#5 2008-12-01 23:38:32

vitaly
Администратор
Откуда: Россия
Здесь с 2008-10-08
Сообщений: 2,788
Рейтинг :   115 

Re: Вопросы по ООП

bestxp, а что в моих-то предложениях тебе не понравилось?
Два совершенно адекватных варианта предложил.
На самом деле их должно быть и побольше, просто сразу в голову ничего другого не пришло.

Вне форума

#6 2008-12-03 16:59:15

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Вопросы по ООП

решение интересное нашлося)


Все просто. Для этих целей можно использовать паттерн singleton, который гарантирует существование только одного экземпляра класса.

В свой класс db добавь слелующий код:


Код:

protected $instance = null;

static public function getInstance()
{
   if (is_null(self::$instance)) {
      self::$instance = new db();
   }
   
   return self::$instance;
}




Там где тебе нужно общаться с БД просто пишешь:

Код:

$db = Db::getInstance();

$db->insert(....); // например


У тебя будет существовать только один экземпляр класса db и он будет храниться в статической переменной класса $instance.

Если ты одновременно работаешь с несколькими БД, то тебе понадобиться к этому реализовать также пулл соединений.


senior php and js developer

Вне форума

#7 2008-12-03 17:55:27

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Вопросы по ООП

вот думаю как решить теперь в итоге получившуюся ошибку


senior php and js developer

Вне форума

#8 2008-12-03 20:51:28

vitaly
Администратор
Откуда: Россия
Здесь с 2008-10-08
Сообщений: 2,788
Рейтинг :   115 

Re: Вопросы по ООП

bestxp, немного теряешь в гибкости.
Если понадобится добавить второе подключение к соверешнно другой БД, то в твоём решении потребуется не только переделать класс DB, но и везде переписать вызов функции getInstance()

В моём варианте достаточно будет в момент инициализации классу просто дать другой конфигуратор (или ссылку на другой объект класса DB).


Озвученный тобой механизм очень полезен в случае, когда класс действительно может быть только один.
К примеру, класс парсинга bb-кодов.
А вот подключений к БД может быть несколько, в будущем какой-то плагин (ведь у тебя и плагины когда-нибудь появятся?) может захотеть делать второе подключение к БД,... и будет жестко обломан архитектурными ограничениями.

Вне форума

#9 2008-12-12 21:07:54

bestxp
Участник
Откуда: Россия
Здесь с 2008-10-13
Сообщений: 133
Рейтинг :   
Сайт

Re: Вопросы по ООП

уже намутил то что хател, притом сделал соединений к бд)))
притом такой функционал с ним открываеться))) что аж приятно))) например одна база для INSERT И UPDATE , а другие для SELECt
при условии что из МастерБД данные реприцируются в другие) фактически огромный прирост произодительности для высокопосещаемых сайтов)))


senior php and js developer

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] ClaudeBot

Подвал форума

Под управлением FluxBB 1.5.11
Модифицировал Visman

[ Сгенерировано за 0.015 сек, 7 запросов выполнено - Использовано памяти: 562.81 Кбайт (Пик: 579.81 Кбайт) ]