Вы не зашли.
Страницы 1
в общем вопрос такой
есть 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
Не в сети
Есть несколько способов:
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. ... другие варианты ...
Не в сети
Не в сети
bestxp, а что в моих-то предложениях тебе не понравилось?
Два совершенно адекватных варианта предложил.
На самом деле их должно быть и побольше, просто сразу в голову ничего другого не пришло.
Не в сети
решение интересное нашлося)
Все просто. Для этих целей можно использовать паттерн 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
Не в сети
bestxp, немного теряешь в гибкости.
Если понадобится добавить второе подключение к соверешнно другой БД, то в твоём решении потребуется не только переделать класс DB, но и везде переписать вызов функции getInstance()
В моём варианте достаточно будет в момент инициализации классу просто дать другой конфигуратор (или ссылку на другой объект класса DB).
Озвученный тобой механизм очень полезен в случае, когда класс действительно может быть только один.
К примеру, класс парсинга bb-кодов.
А вот подключений к БД может быть несколько, в будущем какой-то плагин (ведь у тебя и плагины когда-нибудь появятся?) может захотеть делать второе подключение к БД,... и будет жестко обломан архитектурными ограничениями.
Не в сети
уже намутил то что хател, притом сделал соединений к бд)))
притом такой функционал с ним открываеться))) что аж приятно))) например одна база для INSERT И UPDATE , а другие для SELECt
при условии что из МастерБД данные реприцируются в другие) фактически огромный прирост произодительности для высокопосещаемых сайтов)))
senior php and js developer
Не в сети
Страницы 1