Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 11 Февраль, 2012, 06:29:29

Страниц: 1 [2]
Печать
Автор Тема: Зависимость на уровне интерфейсов  (Прочитано 907 раз)
0 Пользователей и 1 Гость смотрят эту тему.
andipas    ↓ 
17 Август, 2010, 10:20:25
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

К хорошему привыкаешь быстро :) Благодаря почерпнутым здесь и не только новым знаниям, я нашел то что искал.
Вариант реализации паттерна Registry, за основу взял его здесь. Добавил возможность подгружать необходимые мне объекты как синглтон в нужных местах, это то что я давно хотел но не понимал как :) + Узнал о "волшебной" функции __autoload которая избавляет меня от кучи инклудов в коде. Собственно вот код Registry, покритикуйте если что не так на ваш взгляд:
PHP

class Registry {
    private static $_instance = null;
    protected $_oSmarty;
    protected $_oDb;
    protected $_oCurl;
    protected $_oTopic;
    protected $_oTag;
    protected $_oMuzRu;
    protected $_oYtube;
    protected $_aSet;
   
    protected function __construct() {
        $this->_oSmarty = new Smarty;
        $this->_oDb = Database::get();
        $this->_oCurl = new Curl;
        $this->_oTopic = NULL;
        $this->_oTag = NULL;
        $this->_oMuzRu = NULL;
        $this->_oYtube = NULL;
        $this->_aSet = NULL;
    }   
 
    public static function init($instance) {
        self::$_instance = new $instance();
        if (!self::$_instance instanceof Registry) {
            throw new Exception('');
        }
    }
 
    private static function getInstance() {
        if (!self::$_instance) {
            self::init('Registry');
        }
        return self::$_instance;
    }
 
    public static function getDb() {
        return self::getInstance()->_oDb;
    }
 
    public static function getSmarty() {
        return self::getInstance()->_oSmarty;
    }
   
    public static function getCurl() {
        return self::getInstance()->_oCurl;
    }
 
    public static function getTopic() {
        if (self::getInstance()->_oTopic === NULL) {
            self::getInstance()->_oTopic = new Tac('topic');
        }
        return self::getInstance()->_oTopic;
    }
 
        ....     
 
        private function __clone() {}
}
 

Вообщем все отлично и работает, вопрос связан с IDE netbeans, она не понимает вызова объекта таким способом:
PHP

$oTopic = Registry::getTopic();
 

Т.е. потом netbeans не выводит подсказки, методы этого объекта, а хотелось бы. Может кто нибудь знает как?
Записан
kostyl    ↓ 
17 Август, 2010, 11:42:44 , спустя 1 час 22 минуты 19 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 54
Сообщений: 3077
Сила слова: 1.75

Может кто нибудь знает как?
/**
* @return Название возвращаемого класса
*/
getTopic()
Записан

качество жизни обратно пропорционально количеству лени
andipas    ↓ 
17 Август, 2010, 11:54:20 , спустя 11 минут 36 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16


Может кто нибудь знает как?
/**
* @return Название возвращаемого класса
*/
getTopic()
Класс! то что нужно, спасибо )
Записан
krasun    ↓ 
17 Август, 2010, 12:16:12 , спустя 21 минуту 52 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи
Группа: Джедаи

Карма: 41
Сообщений: 1378
Сила слова: 2.98

andipas, а в чем смысл метода init, в смысле, зачем туда передавать параметр $instance. Если все равно это не где потом не используется.
И еще у синглтона обычно приватный конструктор.
Записан
andipas    ↓ 
17 Август, 2010, 12:24:42 , спустя 8 минут 30 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 173
Сила слова: 1.16

kostyl,
andipas, а в чем смысл метода init

Может быть есть смысл какой то, так скопипастил,  в моем случае наверное нет )
Записан
kostyl    ↓ 
17 Август, 2010, 12:41:40 , спустя 16 минут 58 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 54
Сообщений: 3077
Сила слова: 1.75

krasun,
PHP
class TestRegistry extends Registry {
 
  protected function __construct() {
    $this->_db = new TestDb();
  }
}
 
//Пример
//Инициализация для тестирования
Registry::init('TestRegistry');

типа того...
Записан

качество жизни обратно пропорционально количеству лени
krasun    ↓ 
17 Август, 2010, 01:49:19 , спустя 1 час 7 минут 39 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи
Группа: Джедаи

Карма: 41
Сообщений: 1378
Сила слова: 2.98

kostyl, получается родитель знает о своих потомках?
Записан
kostyl    ↓ 
17 Август, 2010, 02:03:11 , спустя 13 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 54
Сообщений: 3077
Сила слова: 1.75

krasun, ну да, это же абстрактная фабрика!
Спустя 3 минуты 4 секунды добавил
или что ты имеешь в виду? Если родитель Registry, а потомок TestRegistry то он знает какие у потомка поля, ибо они в родителе объявлены. И вообще какая разница, всё равно всё инкапсулировано.
Записан

качество жизни обратно пропорционально количеству лени
Страниц: 1 [2]
Печать
 

Перейти в: