【发布时间】:2015-08-25 14:18:20
【问题描述】:
对于我正在处理的 PHP 项目,我有一个对象(实际上是一个单例,但这并不是非常重要,我知道我需要为静态值创建一个特殊情况)。该对象包含受保护的数组,每个数组都有指向十到三十个其他对象的指针。
在维护所有相关引用和索引(大多数数组都是如此)的同时序列化(以及反序列化)整个数据结构的最简单方法是什么?
详情
该程序处理每张由对象表示的卡片,这些对象由包(也是对象)收集并注册到一个称为盒子的对象。包还注册到盒子(通过引用传递对象),该盒子维护两者的索引。 Box执行各种操作(例如从每个包中获取一张随机卡片并将其添加到另一个数组(作为指针)并创建一个称为索引的镜像数组(减去这些卡片),它会洗牌。然后卡片在实例之间“处理”对象播放器(也可能会注册到盒子)。
很高兴认为我可以简单地对 box 进行序列化,一切都会好起来的,但我强烈怀疑这一点。在乱七八糟的对象变成字符串并再次成为对象后,如何确保所有引用(指针数组)都是完整且正确的(而不是对象的副本)?
更新
- 我试图简单地用序列化转储盒子并得到了
类包的对象无法在 /path/to/box.class.php 的 XYZ 行中转换为 int
说实话,这正是我所期望的。因此,我的问题是关于我如何做到这一点。
- 也许我沟通不畅?也许一些代码会让这更清楚。
请注意我们正在进行的参考存储量。我该如何实现 Serializable 接口来解决这个问题?
<?php
class box{
public $cards = array();
public $index = array();
protected $solution = array();
public $packs = array();
public function shuffle(){
if(count($this->index==0)){
$this->index = $this->cards;
}
shuffle($this->index);
}
public function set_up(){
$this->index = $this->cards;
foreach($this->packs as $pack){
$card=$pack->chooseAtRandom();
unset($this->index[$card->getID()]);
$this->solution[]&=$card;
}
$this->shuffle();
}
public function registerPackToBox(&$pack){
$this->packs[] &= $pack;
return (count($this->packs)-1);
}
public function registerCardToBox(&$card){
$this->cards[] &= $card;
return (count($this->cards)-1);
}
// ... other stuff ...
}
【问题讨论】:
-
你能不能只为卡编写自己的序列化函数,然后为包编写一个序列化函数(在每张卡上调用序列化)等,直到你编写了最终的序列化框方法?将对象转换为字符串的目的还在于使其对人眼可读。为什么需要将字符串反序列化为对象?无论如何,您可能会发现这些信息。 community.sitepoint.com/t/object-equivalence-after-serialize/…
-
计划是在会话中持久化对象。我要么序列化对象,要么存储数据并重建对象,这似乎是在重新发明轮子。
-
这可能会有所帮助。 stackoverflow.com/questions/1442177/…。我刚刚看了看,上面写着“对象会自动序列化为 $_SESSION,因此不需要显式序列化”
-
问题是关于确保对象可以被序列化。
标签: php arrays pointers serialization