Несериализованный объект не может быть передан из источника?

1

Поэтому у меня есть сложный объект, который я хочу кэшировать после создания, так как это дорого стоит инициализировать. Я могу восстановить экземпляр внутри файла определения класса, но мне нужно вернуть восстановленный экземпляр вместо new MyClass если моя схема будет полезной. (Не так ли?)

Вот что я сделал до сих пор:

class PayPeriodService
{
    public $type;           // weekly,bi-weekly, semi-monthly, monthlly
    public $payday_first;
    public $close_first;
    public $hours_start;
    public $hours_end;
    public $length;         // in days
    public $periods;        // array of all periods this year
    public $dayInterval;
    public $oneWeekInterval;
    public $twoWeekInterval;
    public $semiFirstInterval;
    public $monthInterval;
    public $initialYear;
    public $today;          // date object

    public function __construct()
    {
        if( Redis::exists('pay-period-instance')) {
            Log:info( 'Fetching Pay-Period from cache.');
            $instance = json_decode(Redis::get('pay-period-instance'));
//            var_dump( $instance );
//            exit();
            return $instance;
        }
        return $this->init();
    }


    public function init()
    {
        Log::info('Reconstituting Pay-Period from primitive definition.');

        $ppdef = PayPeriod::all()->last();
        // etc etc etc, setting up all the properties, loading arrays etc

        // finally I cache the object 
        Redis::set('pay-period-instance', json_encode($this));
        return $this;
    }
}

Поэтому, когда я $ppsvc = new PayPeriodService; экземпляр этого класса, с $ppsvc = new PayPeriodService; в другом классе переменная $ экземпляра в файле PayPeriodService действительна и полностью переделана, полностью функциональна. Но возвращаемый экземпляр в $ ppsvc - это бессмысленная оболочка зомби, которой она должна быть: никаких данных экземпляра, никаких методов.

Какую магию мне нужно призвать, чтобы вернуть восстановленный объект к выезду за границу по мере необходимости? Я изучил интерфейс Serializable и попытался с помощью un/serialize вместо json_encode/decode без существенных изменений в моей проблеме.

Теги:
oop
laravel-5.1

1 ответ

0

Проблема в том, что метод __construct() НЕ возвращает ничего. То, что вы хотите, это синглтон (AFAICU).

Посмотрите на этот пример:

class A {}

class B {
  public function __construct(){return new A;}
}

$b = new B;

print_r($b); // B

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

Простой пример:

class PayPeriodService {

  /**
   * @var self
   */
  static private $instance;

  // private removes the possibility to make a new instance
  private function __construct()
  {
    // object construction logic here
  }

  /**
   * @return PayPeriodService
   */
  static public function getInstance()
  {
    if(!self::$instance)
    {
      self::$instance = new static;
    }

    return self::$instance;
  }
}

$ppsv = PayPeriodService::getInstance(); // will return what you intend

Если объект не постоянно мутирует в Redis, это будет делать трюк. Но при необходимости вы можете легко адаптироваться

Ещё вопросы

Сообщество Overcoder
Наверх
Меню