Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Экземпляр класс, в другом классе
Tumour  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 96
Пользователь №: 42328
На форуме: 1 год, 6 месяцев, 26 дней
Карма:




Вообщем есть 2 класса, один для работы с бд и другой класс выполняющие некие действия и допустим в неком методе нужно обратится с базе данных, а то бишь подключится к бд и сделать некий запрос.

То есть:
Это класс для работы с бд

//Класс для работы с бд

Class DataBase{
//тут всякие свойства

function connectDb(){
//Подключаемся к бд
}

function query(){
//Тут всякие запросы к бд
}
}


Class Analitics{
//Тут всякие свойства
function __construct(){
//Здесь нужно подключится к бд
//Сделать запрос к бд типа INSERT INTO

}
}



Наследовать? В классе DataBase 1000 строк, то бишь куча методов, которые мне не нужны в данный момент.

Создать обьект DataBase в классе Analitics? Почему - то мне кажется это не гуманно так сказать. Хотя я не знаю, собственно за этим сюда и пришел.

Что делать товарищи? Собственно только недавно начал учить ООП, по этому, наверное такие проблемы.


--------------------
Путешествуй с BookRestEasy.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
SerginhoLD  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



че?
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 723
Пользователь №: 24500
На форуме: 6 лет, 9 месяцев, 4 дня
Карма: 55




паттерн Singleton

в твоем Analitics будет что-то вроде
$db = DataBase::getInstance();
$data = $db->query('запрос');


--------------------
"internet explorer всех правильней отображает страницы" ©
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2380
Пользователь №: 27172
На форуме: 6 лет, 3 месяца, 25 дней
Карма: 76




Tumour
Передай его в конструктор.

<?php
//Класс для работы с бд

Class DataBase{
//тут всякие свойства

function connectDb(){
//Подключаемся к бд
}

function query(){
//Тут всякие запросы к бд
}
}


Class Analitics{

//Тут всякие свойства
protected $DataBase;

function __construct(DataBase $DataBase){

$this->DataBase = $DataBase;
//Здесь нужно подключится к бд
//Сделать запрос к бд типа INSERT INTO

}

public function test () {
return $this->DataBase->query("...");
}

}


$Analitics = new Analitics($DataBase);


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Tumour  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 96
Пользователь №: 42328
На форуме: 1 год, 6 месяцев, 26 дней
Карма:




SerginhoLD
Медоты работы с бд которые буду использовать сделать static? Я кстате подумал об этом, но почему - то стеснялся сделать.


--------------------
Путешествуй с BookRestEasy.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Tumour  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 96
Пользователь №: 42328
На форуме: 1 год, 6 месяцев, 26 дней
Карма:




Arh
Спасибо, тоже интересный вариант.
Пошел обдумывать, что будет проще для меня.


--------------------
Путешествуй с BookRestEasy.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
walerus  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чтобы все !
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2383
Пользователь №: 26852
На форуме: 6 лет, 4 месяца, 11 дней
Карма: 130




Tumour
Пользуюсь этим
_class.db.php
<?PHP

class db{


private $con = false; // Идентификатор
private $Queryes = 0; // Число запросов
private $MySQLErrors = array(); // Массив с ошибками
private $TimeQuery = 0; // Всемя запросов
private $MaxExTime = 0; // Максимальное время за 1 запрос
private $ListQueryes = ""; // Список запросов
private $HardQuery = ""; // Самый тяжелый запрос
private $LastQuery = false; // Ресурс запрос
private $ConnectData = array(); // Данные соединения

/*======================================================================*\
Function: __construct
Descriiption: Выполняется при создании экземпляра класса
\*======================================================================*/

public function __construct($host, $user, $pass, $base){
$this->Connect($host, $user, $pass, $base);
// $this->query("SET NAMES 'cp1251'");
// $this->query("SET CHARACTER SET 'cp1251'");

$this->query("SET NAMES 'UTF8'");
$this->query("SET CHARACTER SET 'UTF8'");
}

/*======================================================================*\
Function: Stats
Descriiption: Возвращает статистику по запросам
\*======================================================================*/

public function Stats(){

$sD = array();
$sD["TimeQuery"] = $this->TimeQuery;
$sD["MaxExTime"] = $this->MaxExTime;
$sD["ListQueryes"] = $this->ListQueryes;
$sD["HardQuery"] = $this->HardQuery;
$sD["Queryes"] = $this->Queryes;
return $sD;
}

/*======================================================================*\
Function: GetError
Descriiption: Выводит описание ошибки в поток
\*======================================================================*/

private function GetError($TextError){
$this->MySQLErrors[] = $TextError;
die($TextError);
}


/*======================================================================*\
Function: query
Descriiption: Запрос
\*======================================================================*/

public function query($query, $FreeMemory = false, $write_last = true){

$TimeA = $this->get_time();
$xxt_res = mysqli_query($this->con, $query) or $this->GetError(mysqli_error($this->con));

if($write_last) $this->LastQuery = $xxt_res;

$TimeB = $this->get_time() - $TimeA;
$this->TimeQuery += $TimeB;

if($TimeB > $this->MaxExTime){$this->HardQuery = $query; $this->MaxExTime = $TimeB;}

if( empty($this->ListQueryes) ) $this->ListQueryes = $query; else $this->ListQueryes .= "\n".$query;

$this->Queryes++;

if(!$FreeMemory){
return $this->LastQuery;
}else return $this->FreeMemory();


}

/*======================================================================*\
Function: Connect
Descriiption: Соединяется с ДБ
\*======================================================================*/

private function Connect($host, $user, $pass, $base){
$this->con = @mysqli_connect($host, $user, $pass, $base) or $this->GetError(mysqli_connect_error());
}


/*======================================================================*\
Function: MultiQuery
Descriiption: Множественный запрос
\*======================================================================*/

function MultiQuery($query){

$TimeA = $this->get_time();

mysqli_multi_query($this->con, $query) or $this->GetError(mysqli_connect_error());
$TimeB = $this->get_time() - $TimeA;
$ret_data = array();
$counter = 0;
do{

if ($result = mysqli_store_result($this->con)) {

while ($row = mysqli_fetch_array($result)) {
$ret_data[$counter][] = $row;
}
mysqli_free_result($result);
$counter++;
}


}
while(mysqli_next_result($this->con));



$this->TimeQuery += $TimeB;

if($TimeB > $this->MaxExTime){$this->HardQuery = $query; $this->MaxExTime = $TimeB;}

if( empty($this->ListQueryes) ) $this->ListQueryes = $query; else $this->ListQueryes .= "\n".$query;

$this->Queryes++;

return $ret_data;
}

/*======================================================================*\
Function: get_time
Descriiption: Возвращает строку времени
\*======================================================================*/

private function get_time()
{
list($seconds, $microSeconds) = explode(' ', microtime());
return ((float) $seconds + (float) $microSeconds);
}

/*======================================================================*\
Function: __destruct
Descriiption: Выполняется при уничтожении экземпляра класса
\*======================================================================*/

function __destruct(){

if( !count($this->MySQLErrors) ) mysqli_close($this->con);

}

/*======================================================================*\
Function: FreeMemory
Descriiption: Освобождает память
\*======================================================================*/

function FreeMemory()
{
$tr = ($this->LastQuery) ? true : false;
@mysqli_free_result($this->LastQuery);
return $tr;
}

/*======================================================================*\
Function: RealEscape
Descriiption: Фильтрация )
\*======================================================================*/

function RealEscape($string)
{
if ($this->con) return mysqli_real_escape_string ($this->con, $string);
else return mysql_escape_string($string);
}

/*======================================================================*\
Function: NumRows
Descriiption: Подсчет числа строк
\*======================================================================*/

function NumRows()
{
return mysqli_num_rows($this->LastQuery);
}

/*======================================================================*\
Function: fetch_array
Descriiption: Возвращ массив, создает циферные ключи...
\*======================================================================*/

function FetchArray(){
//if($this->LastQuery)
return mysqli_fetch_array($this->LastQuery);
}

/*======================================================================*\
Function: fetch_assoc
Descriiption: Возвращ ассоциативный массив...
\*======================================================================*/

function FetchAssoc(){
//if($this->LastQuery)
return mysqli_fetch_assoc($this->LastQuery);
}

/*======================================================================*\
Function: NumRows
Descriiption: Возвращает результат
\*======================================================================*/

function FetchRow(){
$xres = mysqli_fetch_row($this->LastQuery);

return (count($xres) > 1) ? $xres : $xres[0];
}

/*======================================================================*\
Function: LastInsert()
Descriiption: Возвращает последний ID вставки
\*======================================================================*/

function LastInsert(){

return @mysqli_insert_id($this->con);

}

}

?>

# База данных подключение
$db = new db( $config->HostDB, $config->UserDB, $config->PassDB, $config->BaseDB );

# Использование класса
$db->Query( "SELECT `user`, `skype`, `date_reg`, `date_login` FROM `db_users` WHERE `id` = '" . $user_id . "'" );
$tmp_data = $db->FetchAssoc();

PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2380
Пользователь №: 27172
На форуме: 6 лет, 3 месяца, 25 дней
Карма: 76




Tumour
Цитата

Спасибо, тоже интересный вариант.
Пошел обдумывать, что будет проще для меня.


Почитай про DI и DI контейнер.

Такой вариант позволяет менять объекты из вне, без костылей к коде класса Analitics.
Например что бы подключиться к другой базе.
$Analitics = new Analitics($DataBase2);
$Analitics = new Analitics($DataBase3);




--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Tumour  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 96
Пользователь №: 42328
На форуме: 1 год, 6 месяцев, 26 дней
Карма:




walerus
Спасибо, я искал как раз класс для подключения к бд, потому, что самому писать, наверное не стоит, потому, что пока не понимаю тонкости.

Arh
Я наконец - то сдвинулся с мертвой точки, спасибо.

Это сообщение отредактировал Tumour - 6.12.2016 - 19:08


--------------------
Путешествуй с BookRestEasy.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2380
Пользователь №: 27172
На форуме: 6 лет, 3 месяца, 25 дней
Карма: 76




Tumour
А зачем писать свой класс для работы с базой?


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Tumour  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 96
Пользователь №: 42328
На форуме: 1 год, 6 месяцев, 26 дней
Карма:




Arh
хм.. ты меня в тупик загнал.

Это сообщение отредактировал Tumour - 6.12.2016 - 19:20


--------------------
Путешествуй с BookRestEasy.com
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2380
Пользователь №: 27172
На форуме: 6 лет, 3 месяца, 25 дней
Карма: 76




Tumour
:)

Ну серьёзно, мне ни разу не понадобилось даже как то расширить стандартный PDO.
А если понадобиться, скорее всего что то не так)
Возможно что бы в нём прописать настройки подключения?

Но можно же один раз подключиться, сохранить куда нибудь объект, а потом от туда забирать.
$config = include ROOT_DIR . '/config/db/localhost.php';
$DB = new PDO($config['type'] . ":dbname=" . $config['dbname'] . ";host=" . $config['host'], $config['user'], $config['password'], []);
$DB->setAttribute(\PDO::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES ' . $config['charset']);
$DB->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$DB->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);


Вот этот $DB, сохраняешь куда нибудь в паттерн репозиторий или DI контейнер.
$DI->set('DB', function() use ($DB) {
return $DB;
});


Потом что то вроде.
$Analitics = new Analitics($DI->get('DB'));


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2380
Пользователь №: 27172
На форуме: 6 лет, 3 месяца, 25 дней
Карма: 76




А потом можно пойти ещё дальше.
Использовать контейнер, который сам удовлетворяет зависимости.
Ты его настраиваешь, потом вызываешь допустим контроллер модуля через него.
echo $DI->get('ModuleController')->result();

Он сам смотрит что требует ModuleController, что требуют объекты, которые передаются в ModuleController, какие там нужно вызвать методы, если надо, что в свойства передать и так далее.


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса