Работа с БД в классах

soulectro

Новичок
Доброго времени.
Возможно не корректно назвал тему, но это все, что пришло в голову в данный момент.
В общем такая ситуация, есть несколько классов разбитых в разные файлы: Users.php, Articles.php, News.php
Нет класса для работы с БД, хочу использовать PDO, которое предоставляет PHP. Можно ли как-то задействовать работу с БД в вышеописанных классах, чтобы не инклюдить в каждый класс файл с соединением к БД и не создавать дополнительный класс? Как бы вы мне посоветовали решить данный вопрос?
Заранее благодарен.
 

zerkms

TDD infected
Команда форума
Передавать инстанс PDO через конструктор в каждый из объектов
 

soulectro

Новичок
соединение PDO где-то же надо инициализировать? или я чего-то недопонимаю?
 

zerkms

TDD infected
Команда форума
В каком-то общем файле, который конфигурит окружение для работы твоего приложения и который подключается до любого другого скрипта (обычно эта часть называется бутстрап/бутстраппинг)
 

soulectro

Новичок
Что-то я поторопился на лыжи вставать... Может есть какой-то пример или в теории расскажите как бутстрап реализовать? Решил посмотреть в фреймворках типа Kohana или Zend, но там через чур мудрено все :)
 

zerkms

TDD infected
Команда форума
Это просто файл, в котором создаются все нужные соединения и подгружаются нужные библиотеки
 

zerkms

TDD infected
Команда форума
Ну автоинклюдится файл. А в каком месте создавать инстанс PDO?
 

ferryman

.............
Так а в чем проблема? При вызове, того же User.php дергать обертку для PDO.
 

zerkms

TDD infected
Команда форума
Эм, так кто будет создавать-то сам объект PDO?
 

Ragazzo

TDD interested
Можно сделать тупо мини-Registry, который будет возвращать компонент работы с БД, там же и автолоад, все как обычно
 

zerkms

TDD infected
Команда форума
Ragazzo
[зануда_mode]регистри - не порождающий паттерн. Он сам создавать объекты не умеет :)
 

Ragazzo

TDD interested
zerkms
Ок ок) щас приведу простенькую реализацию
Сам класс кусками выдран из Yii CApplication
PHP:
<?php
class Application
{

    private static $_app = NULL;

    private $_basePath;

    private static $_config = array();

    private static $_components = array();


    private static $_registredComponents = array(
        'db'          => 'CDbConnection',
    );

    private static $_classMap = array(
       'CDbConnection' => 'protected/lib/CDbConnection.php',
    );

    private function     __construct() {}

    public function  __destruct() {}

    private function    __clone() {}

    public static function  createApplication($config = array())
    {
        if (is_array($config) && is_null(self::$_app))
        {
            self::$_app = new Application;
            self::$_config = $config;
            self::$_app->init();
        }
    }

    public function end()
    {
        exit();
    }

    public function init()
    {
        $this->_basePath = self::$_config['basePath'];
    }

    public static function autoload($className)
    {
        if (isset(self::$_classMap[$className]))
            include_once self::$_classMap[$className];
        return true;
    }

    public static function app()
    {
        return self::$_app;
    }

    private static function getComponent($componentId)
    {
        if (!isset(self::$_components[$componentId]))
        {
            (isset(self::$_config['components'][$componentId])) ? $config = self::$_config['components'][$componentId] : $config = array();
            self::createComponent (self::$_registredComponents[$componentId],$componentId,$config);
        }
        return self::$_components[$componentId];
    }

    private static function createComponent($class,$id,$config = array())
    {
        self::$_components[$id] = new $class($config);
    }

    public static function param($paramName)
    {
        return (isset(self::$_config['appParams'][$paramName])) ? self::$_config['appParams'][$paramName] : NULL;
    }

    public static function loadConfig($path)
    {
        if (is_file($path) && is_readable($path))
        {
            $config = require $path;
            if (is_array($config))
                self::$_config = array_merge(self::$_config,$config);
        }
    }

    public static function getDb()
    {
        return self::getComponent('db');
    }

}

?>
и какой-нибудь бутстрам вида:
PHP:
<?php

/**
 * Gets the application start timestamp.
 */
defined('APP_BEGIN_TIME') or define('APP_BEGIN_TIME',microtime(true));

/**
 * Defines the application framework path.
 */
defined('APP_PATH') or define('APP_PATH',dirname(__FILE__));


include_once 'protected/CApplication.php';
$config = include_once 'protected/config/mainConfig.php';
Application::createApplication($config);
spl_autoload_register(array('Application','autoload'));
set_exception_handler(array(Application::getErrorHandler(),'handleException'));
set_error_handler(array(Application::getErrorHandler(),'handleError'));
date_default_timezone_set('Europe/Moscow');
//ini_set('display_errors',0);
//ini_set('display_startup_errors',0);
ini_set('log_errors_max_len',1024);
ini_set('magic_quotes_gpc',0);



?>
тут жесткий гавнокод вообще, писал давно
 

soulectro

Новичок
Честно говоря, из выше описанного кода мало чего понял. Покопал в гугле, на буржуйских ресурсах нашел пару статей по этой теме чисто теоретических, если я правильно понял, то бутстрап это центральная точка входа в приложение, т.е. все запросы, прежде чем достигнут какой-то определенной точки, проходят через этот самый бутстрап.Но я не могу догнать, если я в этом самом бутстрапе создам инстанс PDO, как его передать другим объектам? Наследовать или еще как-то?
 

soulectro

Новичок
Почитал о шаблонах проектирования Registry и Singletone, вроде бы дают то, что нужно. class Registry extends Singletone дает единственный экземпляр класса, а инстанс я могу получить в любом месте через
$Register = Registry::getInstance();
$Register->get('dbconnection');
Я правильно понимаю?
 
Сверху