无法序列化的对象无法从原点传递?

时间:2015-10-10 06:29:40

标签: php oop laravel-5.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;实例化此类时,PayPeriodService文件中的$ instance变量是有效且完全重构的,完全正常。但是$ ppsvc中返回的实例是一个盲目的僵尸shell,它应该是什么:没有实例数据,没有方法。

我需要调用什么才能让恢复的对象出国旅行,因为它需要做什么?我已经探索了Serializable接口,尝试使用un / serialize代替json_encode / decode而没有对我的问题做出重大改变。

1 个答案:

答案 0 :(得分: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上不断变异,否则这将起到作用。但是你可以根据需要轻松调整