Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связи классов 
:(
    Опции темы
awers
  Дата 19.3.2008, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Немного теории. Имеется класс для работы с БД (db_class). 
Есть класс example_class, есть класс other_class и есть еще n`ное кол-во классов, которые используют класс для работы с БД. Каким бы способом вы посоветовали организовать связь классов с классом БД?

Варианты с 
Код

class db_class{
...
}
$db = new db_class();

class example_class{
var $my_db;
function __construct(){
global $db;
$this->my_db = $db;
}
}

муветон, а
Код

example_class($db)

не очень хотелось бы использовать. 

Что посоветуете?  smile

Добавлено через 4 минуты и 10 секунд
Варианты в http://forum.vingrad.ru/topic-188320.html не удовлетворяют требованиям ) Хотелось бы что-то свежее )

Добавлено через 4 минуты и 53 секунды
Завтра приду почитаю ) Заранее всем Огромное спасибище )
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.3.2008, 03:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Используй Singleton - он же Одиночка. Я так и не понял чем этот вариант тебя не удовлетворяет?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 19.3.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Единственный недостаток - это невозможность передачи параметров __construct`у :(
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.3.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Как нельзя?

Ты получать объект как будешь?
как минимум DB::getInstance($anyparam)

Вот бери эти $anyparam и передавай в конструктор (при первичной инициализации)

Более того ты их можешь сделать static и работать с ними напрямую DB::$login = 'somelogin';

А необходимую тебе работу по инициализации выполнять или в __construct, или в каком-нибудь DB->init();

Короче способов  - просто масса.
Вот тебе пример одного из вариантов, чтобы было нагляднее.
Код

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

    private function __construct()
    {
        $this->version  = '5.0.1.0';
        $this->userId   = null;
        $this->ip       = null;
        $this->deviceId = null;
        $this->db       = ibase_connect(self::$dbLiveDsn,
                                        self::$dbUser,
                                        self::$dbPass);
        Minder_DAO::$_db = $this->db;
        $this->limitCompany = 'all';
        $this->limitWarehouse = 'all';
    }



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 19.3.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



И еще с ходу один бааальшой косяк. 
Код


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


Нельзя вынести для использования extends Singleton. Иначе необходимо совершать совершенно нелогичные вещи аля get_class ...

Добавлено через 33 секунды
Fortop, это понятно, но не так элегантно как хотелось бы
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.3.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Ты определись с функциональностью.

Для того что ты описал Singleton подходит лучше всего. 
Зачем тебе его extends? Не можешь подсказать? Твоя задача этого не требует.
Более того кто тебе мешает расширить его функциональность, объявив
Код

abstract function init()

которую и будешь переопределять там где тебе это нужно. И вызывать ее в конструкторе или вообще где угодно.

Если тебе уж хочется извращений, то посмотри в сторону Factory или Builder. Но ИМХО ты изобретаешь велосипед.
Я подозреваю ты хочешь некий абстрактный Singleton, который будет иметь разные методы в зависимости от типа БД.

Добавлено @ 18:01
А так.. 
Цитата(awers @  19.3.2008,  15:49 Найти цитируемый пост)
И еще с ходу один бааальшой косяк. 
.....
Нельзя вынести для использования extends Singleton. Иначе необходимо совершать совершенно нелогичные вещи аля get_class ...

напоминает очень странную логику. 
Почему нельзя оторвать голову человеку и носить в сумке, а еще лучше менять и чтобы он был жив попрежнему - накосячили тут....
Ух, неэлегантно!

Чтобы ты знал - это не косяк, это основопологающий прицип работы Singleton - уберешь его и он работать не будет.



Это сообщение отредактировал(а) Fortop - 19.3.2008, 18:03


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 19.3.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Цитата(Fortop @  19.3.2008,  18:59 Найти цитируемый пост)
Чтобы ты знал - это не косяк, это основопологающий прицип работы Singleton - уберешь его и он работать не будет.

Я имел в виду что это косяк с точки зрения логики. 


Цитата(Fortop @  19.3.2008,  18:59 Найти цитируемый пост)
Ты определись с функциональностью.

Конкретно в пределах одного класса все гуд. Я тебе плюсик уже поставил. Я хотел использовать Синглетон как паттерн не только для БД, поэтому вынес его и попробовал наследоваться от него. В итоге ничего не вышло так как хотел )
PM MAIL WWW ICQ Skype   Вверх
vasac
Дата 19.3.2008, 21:15 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 8
Всего: 36



Какой, на, муветон?

Нормальный вариант, только:
1. По правильному передавать объект базы лучше через специальный метод (и хорошо бы, чтобы при повторном вызове кидалось исключение).
2. Если все объекты определенного класса работают с одним набором таблиц из одной базы (а обычно так и есть), лучше не каждому объекту каждый раз указывать базу, а один раз сохранить её в статическом свойстве класса и использовать внутри self::$db
PM WWW   Вверх
Fortop
Дата 19.3.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(awers @  19.3.2008,  19:37 Найти цитируемый пост)
Я хотел использовать Синглетон как паттерн не только для БД, поэтому вынес его и попробовал наследоваться от него. В итоге ничего не вышло так как хотел ) 

Ничего не понял.
Ты можешь объяснить, что конкретно ты хотел? Возможно Singleton не нужен в твоей ситуации.

Наследуясь от Singleton ты что хотел получить? Какую функциональность?

Вот тебе пример
Код

class Singleton
{
    static protected $data;
    static protected $instance;

    public function getInstance($params)
    {
          if (self::$instance === null) {
             $c = __CLASS__;
              self::$instance = new $c($params);
          }
          return self::$instance;
    }

    private function __construct($params)
    {
        self::$data = $params;
        $this->init();
    }

    public function getData()
    {
        return self::$data;
    }

    protected function init()
    {
        echo "Original Singleton init()<br/>";
    }
}

class Sample extends Singleton
{
    protected function init()
    {
        echo "Sample extends Singleton<br/>";
    }
    public function getInstance($params)
    {
          if (self::$instance === null) {
             $c = __CLASS__;
          self::$instance = new $c($params);
          }
          return self::$instance;
    }

}

class OtherSample extends Singleton
{
    protected static $instance;

    public function getInstance($params)
    {
          if (self::$instance === null) {
             $c = __CLASS__;
          self::$instance = new $c($params);
          }
          return self::$instance;
    }

}


$s = Sample::getInstance('any param for Sample');
var_dump($s->getData());
$o = OtherSample::getInstance('another param for Other');
var_dump($o->getData());




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 20.3.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Fortop, мда. Ушел учить матчасть  __CLASS__ ... smile
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 20.3.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Да ерунда этот __CLASS__
Для Singleton основным будет являться переопределение getInstance() т.е. ты в любом случае будешь знать какое имя класса у тебя в данной конкретной реализации.
Если же переопределять не будешь - то получишь инстанцию родительского класса.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
awers
Дата 20.3.2008, 02:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



Предпологалось исключение повторного написания паттерна Singleton в кажом классе, который нуждается в данном механизме. Как оказалось __CLASS__ не решает этой проблемы. Ну и бог с ним. В общем и целом это никаким образом не мешает.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.