ФорумПрограммированиеPHP для идиотовPHP и ООП → Зависимость на уровне интерфейсов

Зависимость на уровне интерфейсов

  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 17 августа 2010 г. 10:20, спустя 2 дня 12 часов 40 минут

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

    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, она не понимает вызова объекта таким способом:

    $oTopic = Registry::getTopic();


    Т.е. потом netbeans не выводит подсказки, методы этого объекта, а хотелось бы. Может кто нибудь знает как?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 17 августа 2010 г. 11:42, спустя 1 час 22 минуты 19 секунд

    Может кто нибудь знает как?

    /**
    * @return Название возвращаемого класса
    */
    getTopic()
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 17 августа 2010 г. 11:54, спустя 11 минут 36 секунд


    Может кто нибудь знает как?

    /**
    * @return Название возвращаемого класса
    */
    getTopic()

    Класс! то что нужно, спасибо )
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 17 августа 2010 г. 12:16, спустя 21 минуту 52 секунды

    andipas, а в чем смысл метода init, в смысле, зачем туда передавать параметр $instance. Если все равно это не где потом не используется.
    И еще у синглтона обычно приватный конструктор.
  • andipas

    Сообщения: 170 Репутация: N Группа: Кто попало

    Spritz 17 августа 2010 г. 12:24, спустя 8 минут 30 секунд

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


    Может быть есть смысл какой то, так скопипастил, в моем случае наверное нет )
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 17 августа 2010 г. 12:41, спустя 16 минут 58 секунд

    krasun,
    class TestRegistry extends Registry {

    protected function __construct() {
    $this->_db = new TestDb();
    }
    }

    //Пример
    //Инициализация для тестирования
    Registry::init('TestRegistry');


    типа того…
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 17 августа 2010 г. 13:49, спустя 1 час 7 минут 39 секунд

    kostyl, получается родитель знает о своих потомках?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 17 августа 2010 г. 14:03, спустя 13 минут 52 секунды

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

Пожалуйста, авторизуйтесь, чтобы написать комментарий!