首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跟踪PHP对象属性更改

跟踪PHP对象属性更改
EN

Stack Overflow用户
提问于 2009-08-14 00:27:02
回答 2查看 4.2K关注 0票数 2

我试图跟踪对PHP变量所做的所有更改。变量可以是对象或数组。

例如,它看起来类似于:

代码语言:javascript
运行
复制
$object = array('a', 'b');

然后,使用对象缓存将该对象持久化到存储。当php脚本再次运行时。

因此,当脚本第二次运行时,或者另一个脚本运行并修改该对象时,我希望跟踪这些修改,要么跟踪它们,要么在脚本执行后一次运行。

例:

代码语言:javascript
运行
复制
$object[] = 'c';

我想知道“c”是添加到对象中的。

现在,实际代码如下所示:

代码语言:javascript
运行
复制
$storage = new Storage();
$storage->object = array('a', 'b');

第二负荷:

代码语言:javascript
运行
复制
$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object[] = 'c';

我想知道的是'c‘被推入$ storage ->object中,所以在“存储”类中,我可以将这个值设置为持久存储。

我试过几种方法,那是有效的,但也有缺点。

1)将所有对象封装在一个“可存储”类中,该类跟踪对对象的更改

类“可存储”只是将实际的数据对象保存为属性,然后提供__get()和__set()方法来访问它。当修改或添加对象的成员/属性时,“可存储”类会注意到这一点。当访问属性时,可存储类上的__get()返回属性,包装在另一个可存储类中,以便对每个新级别进行递归跟踪。

问题是对象不再是本机数据类型,因此不能在数组上运行数组函数。

例:

代码语言:javascript
运行
复制
$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

array_push($storage->object, 'c'); // fails

因此,我们必须将这些数组函数实现为可存储的方法。

例:

代码语言:javascript
运行
复制
$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object->push('c');

这一切都很好,但我想知道是否可以以某种方式使用本机函数,以减少我正在开发的库的开销,同时跟踪更改,以便将任何更改添加到持久存储中。

2)忘记跟踪更改,只需更新整个对象结构

这是使程序中的对象与实际存储在对象缓存中的对象(可以在另一台机器上)同步的最简单方法。

但是,这意味着当单个索引发生变化时,必须通过套接字将整个结构(如具有1000个索引的数组)发送到对象缓存。

3)保持对象的镜像(本地)

我还尝试过克隆对象,并将克隆对象保持不变。然后,当所有处理都由PHP脚本完成时,递归地将克隆与修改过的对象进行比较,并将更改的属性提交回对象缓存。

但是,这需要下载整个对象才能使用它。它还要求对象占用两倍的内存,因为它是克隆的。

我知道这是相当模糊的,但有相当多的代码涉及。如果有人想看代码,我可以张贴它,或把它放在一个开放的SVN回购。这个项目是开源的,但我还没有建立一个公共存储库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-14 00:35:51

因为您的“对象”实际上是一个数组,所以不能向其添加功能。用类方法封装它的想法是正确的方法。在这一阶段,担心性能而不是正确的设计是无关紧要和误导的--这种方法所带来的开销对您的整体应用程序性能来说可能是微不足道的。

您应该查看SPL数组类,如ArrayObject。它们提供了一个完整的类似数组的接口,并且易于扩展。

票数 1
EN

Stack Overflow用户

发布于 2009-08-14 00:34:06

老实说,我会重新考虑你在做什么。你真的想把PHP变成它不是的东西。这是在Java和C#而不是PHP中看到的ORM,它本质上是短暂的(除了memcache/APC/etc之外,所有东西都是在每个请求上重新创建的)。这是对复杂的对象缓存和更改跟踪的厌恶。

尽管如此,您可以这样做的唯一方法是将所有内容封装在重载__get()__set()__isset()并实现ArrayAccess的东西中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1275413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档