代码之家  ›  专栏  ›  技术社区  ›  bucabay

跟踪PHP对象属性更改

  •  2
  • bucabay  · 技术社区  · 16 年前

    例如,它看起来像:

    $object = array('a', 'b');
    

    因此,当脚本第二次运行时,或者另一个脚本运行并修改该对象时,我希望跟踪这些修改,无论是在执行时,还是在脚本执行后的一次操作中。

    如:

    $object[] = 'c';
    

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

    $storage = new Storage();
    $storage->object = array('a', 'b');
    

    第二次加载:

    $storage = new Storage();
    
    var_dump($storage->object); // array('a', 'b')
    
    $storage->object[] = 'c';
    

    我想知道的是,“c”被推入$storage->对象,以便在类“Storage”中我可以将该值设置为persistent Storage。

    我尝试了一些方法,这些方法很有效,但也有缺点。

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

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

    如:

    $storage = new Storage();
    
    var_dump($storage->object); // array('a', 'b')
    
    array_push($storage->object, 'c'); // fails
    

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

    如:

    $storage = new Storage();
    
    var_dump($storage->object); // array('a', 'b')
    
    $storage->object->push('c');
    

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

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

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

    3) 在本地保留对象的镜像

    但是,这需要下载整个对象才能使用它。


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

    2 回复  |  直到 16 年前
        1
  •  1
  •   cletus    16 年前

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

    也就是说,你能做到这一点的唯一方法是用过载的东西包装一切 __get() , __set() __isset() 和工具 ArrayAccess .

        2
  •  1
  •   Eran Galperin    16 年前

    由于您的“对象”实际上是一个数组,因此无法向其添加功能。您使用类方法封装它的想法是正确的方法。在这个阶段,担心性能而不是正确的设计是不相关的,也是误导性的——这种方法带来的开销可能对您的整体应用程序性能无关紧要。

    您应该研究SPL数组类,例如 ArrayObject

    推荐文章