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

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

Вы не зашли.

#1 2008-12-01 22: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 23:05:55

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

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. ... другие варианты ... smile

Не в сети

#3 2008-12-02 00:11:01

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

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

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


senior php and js developer

Не в сети

#4 2008-12-02 00:12:03

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

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

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


senior php and js developer

Не в сети

#5 2008-12-02 00:38:32

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

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

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

Не в сети

#6 2008-12-03 17: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 18:55:27

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

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

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


senior php and js developer

Не в сети

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

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

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

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

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


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

Не в сети

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

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

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

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


senior php and js developer

Не в сети

Подвал раздела

Работает на FluxBB