Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Использование обьекта класса работы с бд в других классах
 
 автор: Satori   (02.10.2008 в 10:46)   письмо автору
 
 

Здравствуйте у меня есть класс работы с БД, конструктор создает подключение. Теперь я хочу использовать методы этого класса внутри других классов, если я буду обращаться через :: то не будет подключения, тк обьект не создан. Каждый раз создавать обьект класса db при использовании его методов тоже не вариант. А при попытке передать созданный обьект класса DB через конструктор в новый класс получаю почему-то ошибку что не могу использовать this в классе db. Есть еще вариант создавать огромную цепочку наследования и связать все классы, но это совсем не красиво и может вызвать много проблем.

  Ответить  
 
 автор: Root   (02.10.2008 в 11:35)   письмо автору
 
   для: Satori   (02.10.2008 в 10:46)
 

примерно так:

<?php
class Db
 
{
    private 
$_db;
    private static 
$_instance null;

    private function 
__construct() 
    {
        
$this->_db mysql_connect'localhost''root''***' );
    }

    public static function 
getInstance() 
    {
        if( 
self::$_instance === null 
        {
            
self::$_instance = new self();
        }
        return 
self::$_instance;
    }
}


$db Db::getInstance();
?>


почитайте паттерны, например тут

  Ответить  
 
 автор: Satori   (02.10.2008 в 11:52)   письмо автору
 
   для: Root   (02.10.2008 в 11:35)
 

Внутри нового класса мне писать так ?


private $db;
$this->db = Db::getInstance();


И затем использовать методы db в таком виде ?

$this->db->do_something();

  Ответить  
 
 автор: Root   (02.10.2008 в 11:54)   письмо автору
 
   для: Satori   (02.10.2008 в 11:52)
 

да

  Ответить  
 
 автор: Satori   (02.10.2008 в 11:59)   письмо автору
 
   для: Root   (02.10.2008 в 11:54)
 

Спасибо, а если я хочу передавать данные о подключении из конфигурационного файла мне их передавать в функцию get_instance или все будет работать если я все сделаю как и раньше через конструктор ?

  Ответить  
 
 автор: Root   (02.10.2008 в 12:08)   письмо автору
 
   для: Satori   (02.10.2008 в 11:59)
 

>как и раньше через конструктор ?

я не знаю как у Вас было раньше, и какой у Вас конфиг.

  Ответить  
 
 автор: Satori   (02.10.2008 в 12:14)   письмо автору
 
   для: Root   (02.10.2008 в 12:08)
 


<?PHP
public function __construct($host$db$login$pass)
    {

        
$this->link = @mysql_connect($host,$login,$pass);

        if(!
$this->link)
        {
            throw new 
Exception("MySQL_ERROR",404);
        }

        
mysql_select_db($db,$this->link);

        
$this->sql_query("SET NAMES utf8");

    }
?>


В конфиге просто константы которые я передаю при создании обьекта класса
Так подключаюсь к базе:
<?PHP $db = new dbSERVERDATABASELOGINPASSWORD); ?>

  Ответить  
 
 автор: Root   (02.10.2008 в 12:21)   письмо автору
 
   для: Satori   (02.10.2008 в 12:14)
 

ну если константы, можно сразу в классе:
<?php
mysql_connect
(SERVERLOGINPASSWORD);
?>

  Ответить  
 
 автор: Гость   (03.10.2008 в 19:26)   письмо автору
 
   для: Satori   (02.10.2008 в 10:46)
 

Может я что-то не понял, и мне объяснят? а в чем сложность сделать например так :


<?
class Db 

// Работа с базой
}

class 
Need_bd
{
    public 
$bd;
    private function 
__construct()  
    { 
        
$this->bd = new Db(); 
       
// И далее где необохдима идет вызов типа $this->bd->exec();
    
}
}


Просто я с ооп работал мало и хотелось бы понимать почему делают именно так и не иначе.

  Ответить  
 
 автор: root   (03.10.2008 в 22:33)   письмо автору
 
   для: Гость   (03.10.2008 в 19:26)
 

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

в примере выше есть статическая переменная $_instance. Она хранит в себе ссылку на экземпляр класса Db, который создается при первом вызове Db::getInstance(). И теперь каждый раз при вызове метода getInstance() возвращается ссылка на этот объект (на часть памяти выделенный под объект).

  Ответить  
 
 автор: Гость   (03.10.2008 в 23:28)   письмо автору
 
   для: root   (03.10.2008 в 22:33)
 

Понял, спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования