我已经使用PHP几年了,但到目前为止,从未需要明确地处理序列化,只使用了$_SESSION.现在我有一个项目要求我手动实现某些数据的序列化机制 - 我意识到这个问题也适用$_SESSION.
我有一个包含许多属性的类.大多数这些属性都很小(如内存消耗):数字,相对较短的字符串等.但是该类还包含一些属性,这些属性可能包含HUGE数组(例如,数据库表的整个转储:100,000行,每行100个字段) ).碰巧,这是需要序列化/反序列化的类之一 - 幸运的是,包含大型数组的属性不需要序列化,因为它们本质上是临时工作,并且在必要时进行重建.
在Java中的这种情况下,我只是将属性声明为transient- 并且它将从serialisaion中省略.不幸的是,PHP不支持这样的限定符.
处理的一种方法是它有这样的东西:
class A implements Serializable
{
private $var_small = 1234;
private $var_big = array( ... ); //huge array, of course, not init in this way
public function serialize()
{
$vars = get_object_vars($this);
unset($vars['var_big']);
return serialize($vars);
}
public function unserialize($data)
{
$vars = unserialize($data);
foreach ($vars as $var => $value) {
$this->$var = $value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这是相当麻烦的,因为serialize每次添加另一个瞬态属性时我都需要更新方法.此外,一旦继承发挥作用,这变得更加复杂 - 处理,因为瞬态属性可能在子类和父类中.我知道,它仍然可行,但我更愿意尽可能多地委托语言,而不是重新发明轮子.
那么,处理瞬态属性的最佳方法是什么?或者我错过了什么,PHP支持这个开箱即用?