За последние 24 часа нас посетили 22773 программиста и 1269 роботов. Сейчас ищут 784 программиста ...

Шаблон проектирования "почти адаптер"

Тема в разделе "Решения, алгоритмы", создана пользователем DZEN, 4 апр 2012.

  1. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Скорее всего вопрос глупый и его решение либо отсутствует в принципе, либо его решение уже давно используется везде где только можно. Сам класс:
    Код (Text):
    1. class adapter
    2. {
    3.     protected static $instance = null;
    4.     private function __construct() {}
    5.     private function __clone() {}
    6.     private function __wakeup() {}
    7.     public static function self()
    8.     {
    9.         return is_null(self::$instance) ? self::$instance = new self : self::$instance;
    10.     }
    11.     private $var;
    12.     public static function put($var)
    13.     {
    14.         self::self()->var = $var;
    15.     }
    16.     public static function retrieve()
    17.     {
    18.         return self::self()->var;
    19.     }
    20. }
    Использование объекта:
    Код (Text):
    1. adapter::self()->put('I have something to hide!!!');
    2. echo adapter::self()->retrieve();
    Упростить до:
    Код (Text):
    1. adapter::put('I have something to hide!!!');
    2. echo adapter::retrieve();
    Хотя бы посмотреть варианты решения.
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Я бы сказал "почти реестр"
     
  3. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Суть вопроса не в методах put и retrieve, а в реализации одиночки без перманентного обращения к методу получения экземпляра. Я пытался искать с использованием __callStatic, но ничего подобного не нашёл.
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Ну тогда вы правильно смотрели в сторону __callStatic
    Код (PHP):
    1. <?php
    2.  
    3. class SugarAdapter
    4. {
    5.     static $obj;
    6.  
    7.     public function setInstance($object){
    8.         self::$obj = $object;
    9.     }
    10.  
    11.     public function getInstance(){
    12.         if (empty(self::$obj)){
    13.              throw new Exception('Object was not instance');
    14.         }
    15.         return self::$obj;
    16.     }
    17.  
    18.     public static function __callStatic($method, $params){
    19.         return call_user_func_array(array(self::getInstance(),$method), $params);
    20.     }
    21. }
    22.  
    23.  
    24. class A
    25. {
    26.     public function foo(){
    27.         var_dump($this);
    28.     }
    29. }
    30.  
    31. SugarAdapter::setInstance( new A() );
    32. SugarAdapter::foo();
    33.  
     
  5. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Не знаю откуда код, но setInstance и getInstance наверное лучше было объявлять статичными. Отличный пример.
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    да, вы правы. Моя ошибка :)