2013-12-09 41 views
2

改變陣列我一直在使用__set魔術方法與保護性監視的變化,使我的班級知道他們是否有東西保存。有沒有辦法監視數組類型屬性的更改?我明白,通常你通過引用訪問數組,並且像array_push這樣的函數不會觸發__set方法,它們將使用對數組的引用。檢測在PHP

我要的是基本上是這樣:

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

我那麼就在所有的球員屬性的跟蹤來告訴我,如果持續性需求進行更新。 (技巧也會有這個功能,但是這個示例是基本的)。另外,我想迫使他們保持同步(這是一種雙向關係)。

有沒有辦法做到這一點,允許它表現得像一個數組(不要想通過製造類只是同步,如果這些我沒有)。

回答

4

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

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

這看起來正是我想要的。稍後我會測試它的適用性。不知道ArrayObject。太棒了。我不得不改變這一點,並且會調用對象來改變跟蹤數組,併爲構造器提供一個字段名以保持同步(包括從數組中移除)。總之,這可以讓我做一個簡單的課程來充當我想要的98%的墊片。 (我一直希望沒有任何課,做數組是其中的一部分,但最好的解決方案並不總是適合你的原始模式的課程)。 – lassombra

+0

很高興這可以幫助你,它從你當前的實現有點偏離,但事實上,根據定義,「ArrayObject實現IteratorAggregate,ArrayAccess,Serializable,Countable」意味着你可以像數組一樣使用對象(http://www.php。 net/manual/en/class.arrayaccess.php) –

+0

請注意,PHP不會將'ArrayObject'(或'ArrayAccess'等)視爲一個數組。 'array_ *'方法會失敗,'+'操作符會失敗等。 – Tgr

1

你可以看看像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"); 
    } 
} 
+0

這並不是說這是太麻煩了(討厭,但可行),但我真的希望有更好的解決方案。我也不想爲每個這樣的項目編寫特殊的代碼(我試圖使這個項目儘可能重用,因爲我還有兩個作品需要幾乎相同的體系結構)。這個解決方案確實必須爲每個這樣的陣列單獨開發(其中會有很多)。 – lassombra

+0

@lassombra我不知道爲什麼你認爲後面的例子('FancyArray')每次實施時都需要個性化。這是一個可以回收的類。 – Marty

+0

錯過了該部分。這(如下面的答案)幾乎是我所追求的。正如我所說的那樣,我期望的是玩家類可以在不編寫單獨的類的情況下監控(同時允許數組功能保留)對陣列的更改。幸運的是,單獨的課程並沒有太多需要改變。現在的挑戰是,我只能接受一個答案...... – lassombra