我目前正在研究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(); // <<<<<<<
这会引发错误。
知道如何在反序列化时恢复对象的状态吗?
请帮忙!
由于
答案 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');
}
}