在PHP中反序列化以恢复到对象

时间:2011-08-12 15:44:09

标签: php zend-framework serialization

我目前正在研究zend框架并试图存储一个对象的序列化版本让我们说

class customer{
   protected $id;
   public static function getInstanceById( $id )
   {
      $this->id=$id;
   }
   public function getOrders()
   {
       return array('pizza', 'pancake', 'etc');
   }
}

如果我这样做

$customer = Customer::getInstanceById(1);
$content = serialize( $customer );
file_put_contents('file.txt', $content);

以后我做

$data = file_get_contents('file.txt');
$customer = unserialize( $data );
$order = $customer->getOrders(); // <<<<<<<

这会引发错误。

知道如何在反序列化时恢复对象的状态吗?

请帮忙!

由于

4 个答案:

答案 0 :(得分:2)

在调用unserialize()方法之前需要加载类(在这种情况下是客户) -

Forexample

include("customer.php"); // consider that customer class is defined the file customer.php

$data = file_get_contents('file.txt');
$customer = unserialize( $data );
$order = $customer->getOrders(); // <<<<<<<

答案 1 :(得分:1)

对于这些事情,PHP文档通常非常彻底。查看Object Serialization上的页面。

答案 2 :(得分:0)

方法getInstanceById不会返回任何内容。所以你基本上是序列化null。此外,方法体无效。您不能在静态方法中使用实例上下文($this)。

正因为如此,您收到的错误可能与serialize / unserialize过程无关,而是与静态上下文中使用无效实例上下文有关。

因此,如果这是您打算使用的代码,它不会执行我认为您希望它执行的任何操作,例如:返回customer的实例,并将id传递给getInstanceById

我认为你想要这样的东西:

class customer
{
    protected $id;
    protected $otherProperty1;
    protected $otherProperty2;

    // prevent publically allowing creating instances
    // but force using getInstanceById for example
    protected function __construct( $id, array $otherData = null )
    {
        $this->id = $id;

        // very simplistic example
        $this->otherProperty1 = $otherData[ '$otherProperty1' ];
        $this->otherProperty2 = $otherData[ '$otherProperty2' ];
    }

    // this static method now WILL return an instance of customer
    public static function getInstanceById( $id )
    {
        $data = self::retrieveInstanceDataFromSomePersistenceStorage( $id );

        // very simplistic and dirty example;
        return new self( $data[ 'id' ], $data );
    }
}

答案 3 :(得分:0)

试试这个

class customer{
   protected $id;
   public static function getInstanceById( $id )
   {
      $customer = new customer();
      $customer->id = $id;
      return $customer;
   }
   public function getOrders()
   {
       return array('pizza', 'pancake', 'etc');
   }

}