Поэтому у меня есть сложный объект, который я хочу кэшировать после создания, так как это дорого стоит инициализировать. Я могу восстановить экземпляр внутри файла определения класса, но мне нужно вернуть восстановленный экземпляр вместо 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 без существенных изменений в моей проблеме.
Проблема в том, что метод __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, это будет делать трюк. Но при необходимости вы можете легко адаптироваться