|
|
|
| Здравствуйте у меня есть класс работы с БД, конструктор создает подключение. Теперь я хочу использовать методы этого класса внутри других классов, если я буду обращаться через :: то не будет подключения, тк обьект не создан. Каждый раз создавать обьект класса db при использовании его методов тоже не вариант. А при попытке передать созданный обьект класса DB через конструктор в новый класс получаю почему-то ошибку что не могу использовать this в классе db. Есть еще вариант создавать огромную цепочку наследования и связать все классы, но это совсем не красиво и может вызвать много проблем. | |
|
|
|
|
|
|
|
для: 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();
?>
|
почитайте паттерны, например тут | |
|
|
|
|
|
|
|
для: Root
(02.10.2008 в 11:35)
| | Внутри нового класса мне писать так ?
private $db;
$this->db = Db::getInstance();
|
И затем использовать методы db в таком виде ?
$this->db->do_something();
|
| |
|
|
|
|
|
|
|
для: Satori
(02.10.2008 в 11:52)
| | да | |
|
|
|
|
|
|
|
для: Root
(02.10.2008 в 11:54)
| | Спасибо, а если я хочу передавать данные о подключении из конфигурационного файла мне их передавать в функцию get_instance или все будет работать если я все сделаю как и раньше через конструктор ? | |
|
|
|
|
|
|
|
для: Satori
(02.10.2008 в 11:59)
| | >как и раньше через конструктор ?
я не знаю как у Вас было раньше, и какой у Вас конфиг. | |
|
|
|
|
|
|
|
для: 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 db( SERVER, DATABASE, LOGIN, PASSWORD); ?>
|
| |
|
|
|
|
|
|
|
для: Satori
(02.10.2008 в 12:14)
| | ну если константы, можно сразу в классе:
<?php
mysql_connect(SERVER, LOGIN, PASSWORD);
?>
|
| |
|
|
|
|
|
|
|
для: Satori
(02.10.2008 в 10:46)
| | Может я что-то не понял, и мне объяснят? а в чем сложность сделать например так :
<?
class Db
{
// Работа с базой
}
class Need_bd
{
public $bd;
private function __construct()
{
$this->bd = new Db();
// И далее где необохдима идет вызов типа $this->bd->exec();
}
}
|
Просто я с ооп работал мало и хотелось бы понимать почему делают именно так и не иначе. | |
|
|
|
|
|
|
|
для: Гость
(03.10.2008 в 19:26)
| | В Вашем случае Вы в каждом классе, который будет работать с базой устанавливаете новое соединение.
в примере выше есть статическая переменная $_instance. Она хранит в себе ссылку на экземпляр класса Db, который создается при первом вызове Db::getInstance(). И теперь каждый раз при вызове метода getInstance() возвращается ссылка на этот объект (на часть памяти выделенный под объект). | |
|
|
|
|
|
|
|
для: root
(03.10.2008 в 22:33)
| | Понял, спасибо. | |
|
|
|