我一直在使用具有受保护属性的__set magic方法来监视更改,以便我的类知道它们是否有要保存的内容。是否有任何方法可以监视数组类型属性的更改?我知道,通常你通过引用访问数组,像array_push这样的函数不会触发__set方法,它们会使用对数组的引用。
我想要的基本上是:
class Skill{ public $Player, $Name, $Level;}
class Player {
protected $Name, /*Other properties*/, $Skills /*Array*/
}
然后我跟踪Player中的所有属性,告诉我是否需要更新持久性。(Skill也有这个功能,但这显示了基本示例)。此外,我想强制它们保持同步(这是一种双向关系)。
有没有什么方法可以做到这一点,让它表现得像一个数组(如果没有必要的话,我不想通过创建一个类来同步它们)。
您可以扩展ArrayObject和代理附加:
class Skills extends ArrayObject
{
public function append($value)
{
// track changes
parent::append($value);
}
}
您可以研究类似runkit_function_redifine()
的东西,但为您想要的东西制作辅助方法真的太麻烦了吗?例如
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");
}
}