ФорумПрограммированиеPHP для идиотов → класс registry применительно к мемкешу

класс registry применительно к мемкешу

  • soul

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

    Spritz 25 января 2010 г. 11:18

    Такая проблема. Кеширую мемкешем некоторые модули сайта, которые находятся в разных классах. Так как нельзя передать объект мемкеша (и соединение соответственно) классу, приходится в каждом модуле создавать объект мемкеша и подключаться к нему, а это потери в производительности.

    Дуд посоветовал registry, я пошел в поиск. Дуд пропал, а вопросы есть. Так что спрашиваю,

    1) при копировании объекта в классе registry функция __construct() выполняется снова, или копируется уже полностью готовый объект? не понятен мне механизм клонирования.

    2) если я скопирую объект мемкеша, мне придется заново открывать соединение или оно сохранится? так же исходит от непонимания механизма

    под объектом я подразумеваю $cache в $cache = new Memcache;
    под подключением метод $cache->connect('localhost', 11211);

    сам класс registry


    class Registry
    {
    /**
    * Статическое хранилище для данных
    */
    protected static $store = array();

    /**
    * Защита от создания экземпляров статического класса
    */
    protected function __construct() {}
    protected function __clone() {}

    /**
    * Проверяет существуют ли данные по ключу
    *
    * @param string $name
    * @return bool
    */
    public static function exists($name)
    {
    return isset(self::$store[$name]);
    }

    /**
    * Возвращает данные по ключу или null, если не данных нет
    *
    * @param string $name
    * @return unknown
    */
    public static function get($name)
    {
    return (isset(self::$store[$name])) ? self::$store[$name] : null;
    }

    /**
    * Сохраняет данные по ключу в статическом хранилище
    *
    * @param string $name
    * @param unknown $obj
    * @return unknown
    */
    public static function set($name, $obj)
    {
    return self::$store[$name] = $obj;
    }
    }

  • Ewg777

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

    Spritz 25 января 2010 г. 12:08, спустя 49 минут 26 секунд

    Одиночка поможет.

    class Foo
    {
       private static $_instance;

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

       public function do()
       {
           echo 'Ya not static!';
       }
    }

    Foo::getInstance()->do();

    Спустя 132 сек.
    Кто редактирование отключил?
    В конструктор можно положить подключение мемкэша.
    Вызывать всё это Foo::getInstance()->get(…
    Спустя 77 сек.
    Но лучше один раз получить нужные данные и отключиться.
    NRG, спасибо
  • soul

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

    Spritz 25 января 2010 г. 11:54, спустя 23 часа 46 минут 16 секунд

    честно говоря с синглтоном раньше не встречался вплотную.. побежал в поиск.
    а это нормально отдельно кешировать блоки каждый раз включая/отключая буферизацию?
    вопрос еще был. у меня есть класс, который получает данные из бд. если я объект этого класса создам и помещу в registry, __construct() запустится снова и вновь получит значения из бд или скопирует уже созданный объект с его значениями?
    и будет еще памяти жрать столько же, как и объект который в регистри положили? не растрата ли это?

    у меня каждому классу передаются какие-то параметры из одного (основного) класса, хотелось бы так же положить в регистри объект этого класса и получать его спокойно, не передавая кучу параметров (не основным) классам.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 12:02, спустя 7 минут 45 секунд

    Кто редактирование отключил?
    я отключил, чтобы не стирали мессаги
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 12:02, спустя 28 секунд

    скопирует уже созданный объект с его значениями?
    да. в пхп объекты не копируются, а передаются по ссылке. сколько угодно раз адресуйся к одной инстанции, она не пересоздастся и тп. начиная с пхп5 не копируются и другие структуры - строки, инты, флоаты, все остальное короче. они(все труктуры кроме объектов) копируются только при попытке изменения
    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 12:03, спустя 53 секунды

    Ewg777, сделал тебя джедаем… теперь ты сможешь редактировать посты свои :)
    adw/0
  • soul

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

    Spritz 25 января 2010 г. 12:26, спустя 22 минуты 38 секунд

    насколько я знаю, метод __clone() не передает по ссылке, а именно копирует.

    а то что нельзя редактировать комментарии не нравится никому :(
  • Шурикен

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

    Spritz 25 января 2010 г. 12:41, спустя 15 минут 4 секунды

    сорри, что влезаю.
    помогите разобраться плиз.
    как раз по вот этому примеру вопрос.
    class Foo
    {
    private static $_instance;

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

    public function do()
    {
    echo 'Ya not static!';
    }
    }

    Foo::getInstance()->do();

    пишет

    Parse error: syntax error, unexpected T_DO, expecting T_STRING in Z:\home\test1.ru\www\singleton\exClass.php on line 13

    поменя do() на bla()
    пишет
    Fatal error: Access to undeclared static property: Foo::$instance in Z:\home\test1.ru\www\singleton\exClass.php on line 8


    в книжке был такой пример
    	class Logger{

    static private $instance=NULL;

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

    function Log($str)
    {
    echo $str;
    }

    }

    Logger::getInstance()->log('bla');

    ошибка:
    Fatal error: Call to a member function log() on a non-object in Z:\home\test1.ru\www\singleton\exClass.php on line 21

    чего не так делаю?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 12:53, спустя 12 минут 3 секунды


    насколько я знаю, метод __clone() не передает по ссылке, а именно копирует.

    а то что нельзя редактировать комментарии не нравится никому :(
    а интуитивное название метода ни говорит разве о его прямом предназначении? да, копирует, я же не говорил что в пхп5 нельзя скопировать объект
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 13:21, спустя 27 минут 49 секунд

    NRG, спасибо

    О_о, за что ?
  • soul

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

    Spritz 25 января 2010 г. 13:32, спустя 11 минут 35 секунд

    1) допустим в классе нужен цикл


     while ($i < 100000) {
            //чето делаем
            ++$i;    
     }


    но переменная $i не объявлена в классе, объявить и юзать $this->i тоже беспантово. этот вопрос меня с самого начала изучения пыхи мучает.
    как правильно делать??

    2) какое тогда отличие синглтона от регистри, кроме как в реализации?

    3) вот вернул мне синглтон объект. к нему обращаться как к обычному объекту типа $obj->do(); ?

    чтобы внутри класса получить внешний объект example, я так понял надо сделать так $this->var = example::getInstance();
    верно?
  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 13:35, спустя 2 минуты 57 секунд

    class Foo
    {
       private static $_instance;

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

       public function do()
       {
           echo 'Ya not static!';
       }
    }

    Foo::getInstance()->do();


    в примере дурацкая ошибка $_instance
    нехуй копипастить

    вот вам регистр
    http://mabp.kiev.ua/2008/04/17/pattern-registry/
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 25 января 2010 г. 13:36, спустя 1 минуту 5 секунд

    CTAPbIu_MABP, хыы, детка, да детка так их!)
    Сапожник без сапог
  • soul

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

    Spritz 25 января 2010 г. 13:49, спустя 13 минут 9 секунд

    ну ответьте мне. это последние непонятки остались.
  • Абырвалг

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

    Spritz 25 января 2010 г. 13:53, спустя 3 минуты 58 секунд

    я не люблю реестр (кеш-системы не в счет. Или они сюда не относятся). Не вижу никакого профита в нем. Вот синглтон - да, удобно. В фабриках нужды не было.

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