Посоветуйте структуру классов

virakochi

Устал
Посоветуйте структуру классов

Юзаю PEAR :: DB

Есть набор классов, которым нужно обращаться к базе.. Не хочется всюду брать глобальный $conn.

Корректно ли будет создание небольшого класса с набором необходимых методов типа
PHP:
class myDb{
	
	function myDb() {
	}
	
	function getAll($sql_query){
		global $conn;
		return $conn->getAll($sql_query);
	}
}
и далее использоватькак
PHP:
myDB :: getAll($sql_query);
Спасибо.
 

virakochi

Устал
Я и не говорю, что это хорошо. Потому и спрашиваю совета. Можно еще передавать ссылку на ресурс каждому классу, чтоб он юзал сам. Можно порождать классы от одного, в котором описана работа с БД.
Как правильно?
 

virakochi

Устал
lucas
Ясно. Перейду сразу к третьему номер 2.

Значит нефиг выдумывать.
 

Макс

Старожил PHPClub
Можно еще передавать ссылку на ресурс каждому классу, чтоб он юзал сам.
ИМХО этот вариант более красив.
Я вообще делаю регистр объектов (отдельный класс) который хранит ссылки на всякие объекты (и именно я по ссылке передаю своим объектам). В ПХП5 через статические переменные можно еще красивее сделать без создания лишних переменных (Registry::get('db');)
 

virakochi

Устал
Макс
Спасибо.

Можно еще передавать ссылку на ресурс каждому классу, чтоб он юзал сам
Именно этот вариант использовал раньше. Просто хотелось убрать из конструкторов передачу ресурса. Да и по логике про БД знает только один класс.

А чем плох вариант в первом посте (кроме global)?
 

lucas

Guest
А чем плох вариант в первом посте (кроме global)?
Замени global на что-то типа storage :: get('db_connection') и получишь вариант Макса. Очень хороший вариант.
 

virakochi

Устал
lucas
Потыкался... Не разобрался, как устроить такое storage :: get('db_connection')

То есть где storage будет хранить ссылки на объекты?
 

Макс

Старожил PHPClub
это я писал для ПХП5
там у классов есть статические переменные (в 4-ке их нет) :
PHP:
class Registry {
    private static $_cache = array();
    
    public function setEntry($key, $item) {
        Registry::$_cache[$key] = $item;
    }
    public function getEntry($key) {
        return Registry::$_cache[$key];
    }
}
$a = 'aaaaaaa';
Registry::setEntry('a', $a);
echo Registry::getEntry('a');
Это по простому без проверок.
Под ПХП4 вроде насколько я помню статические переменные есть у функций. Можно попробовать как-то это использовать (пробовать лень, сейчас 4-го ПХП под рукой нет :))

В ПХП4 я ичпользовал что-то похожее на класс Registry из статьи
http://phppatterns.com/index.php/article/view/75/1/1
Только в этом случае нельзя будет вызывать Registry::getEntry('db');
А надо будет передавать в функцию (ссылку) объект класса Registry или делать его global (первый вариант мне нравится больше)
 

virakochi

Устал
Макс
Когда копался, написал аналогичный класс, но под 4.3.8 он, естественно, не пашет.

Спасибо за ссылку.. До чего-то подобного уже успел дойти.
 

SergeR

Новичок
Сейчас рассматривал как это сделано в Xoops2. Интересное решение:
есть класс XoopsDatabaseFactory, у которого есть метод getDBConnection типа
PHP:
class ....
{
....
function &getDBConnection()
{
 static $connection;
 if !isset( $connection )
 {
  .... connect to the database and set $connection variable...
 }
 return $connection;
}
}
Если наследовать свой класс от PEAR::DB, то можно добавить ему подобный метод и перегрузить необходимые (getAll и т.д.) типа

PHP:
function getAll()
{
  $con = $this->getDBconnectuion();
  ...
}
Имхо, неплохой вариант для PHP 4.x !

-~{}~ 11.09.04 21:41:

хотя.... зачем его наследовать? можно просто свой wrapper написать...
 
Сверху