检测PHP中对Array的更改

时间:2013-12-09 06:04:21

标签: php arrays change-tracking

我一直在使用带有受保护属性的__set魔术方法来监视更改,以便我的类知道他们是否有要保存的内容。有没有办法监视数组类型属性的变化?我知道通常你通过引用访问数组,像array_push这样的函数不会触发__set方法,它们会使用对数组的引用。

我想要的基本上是这样的:

class Skill{ public $Player, $Name, $Level;}
class Player {
    protected $Name, /*Other properties*/, $Skills /*Array*/
}

然后我跟踪播放器中的所有属性,告诉我是否需要更新持久性。 (技能也会有这个功能,但这显示了基本的例子)。另外,我想强制它们保持同步(这是一种双向关系)。

有没有办法做到这一点,它允许它表现得像一个数组(如果我不需要,不想通过创建一个类来同步那些)。

2 个答案:

答案 0 :(得分:4)

你可以扩展ArrayObject和代理追加:

class Skills extends ArrayObject
{
    public function append($value)
    {
        // track changes
        parent::append($value);
    }
}

答案 1 :(得分:1)

你可以看一下像runkit_function_redifine()这样的东西,但是为你想要的东西制作辅助方法真的太麻烦了吗? e.g。

class Player
{
    private $skills = array();

    protected function addSkill($skill)
    {
        // Do something.
        //

        $this->skills[] = $skill;
    }
}

甚至是数组的包装器,使其更清洁:

class FancyArray
{
    private $content = array();

    public function add($value)
    {
        // Do something.
        //

        $this->content[] = $value;
    }

    public function remove($value){ /* blah */ }

    public function getContent(){ return $this->content; }
}

class Player
{
    protected $skills;

    public function __construct()
    {
        $this->skills = new FancyArray();
        $this->skills->add("Ninjitsu");
    }
}