2013-01-08 156 views
1

比方說,我有一個包含數十個屬性的類的實例。這個類不能被修改或擴展。OOP模式將一種數據格式轉換爲另一種數據格式

我現在需要將一些數據從這個實例傳遞給一個函數。該函數只需要這些屬性中的一部分,並且不能直接使用類的實例(它需要關聯數組),並且還需要一些不存在於實例中的數據。所以我需要將實例轉換爲關聯數組。

比如我需要轉換成這樣:

class Person { 

    public $id = 123; 
    public $firstName = "John"; 
    public $lastName = "Something"; 
    public $address; 
    public $city; 
    public $zipCode; 
    // etc. 

} 

這樣:

array(
    'id' => 123, 
    'name' => 'John Something' 
); 

我的問題是:是否有任何已知的OOP模式來處理這種轉換?我知道我可以編寫一個簡單的函數來將一種格式轉換爲另一種格式,但我想知道什麼是「正確」的方法,如果可能的話,基本上使用已知的模式。

+0

這聽起來可能超出了主題。但我很好奇你爲什麼把$放在變量名之前。 –

+0

我認爲使用反射迭代對象的屬性是一種很好的通用方法來攻擊這樣的問題。 – EJK

+0

@MichaelArdan它是PHP。 – MrLore

回答

1

正如你所要求的設計模式, Adapter Pattern可能是最合適的一個

在你的例子中,Person是Adaptee,你的Adapter將擴展Array-Class並覆蓋訪問方法。適配器的實現可能會有所不同,因爲您仍然需要決定是要明確訪問適配器字段,還是要封裝通用訪問(例如,使用反射)。

注意,該解決方案是不是真的「轉換」到獨立陣列的數據在你的人,其對您的要求影響的情況下仍可以備份你可能有:

  • 正如你也想要添加其他數據字段,您可能需要根據邏輯進一步擴展適配器。
  • 如果其他陣列操作應該反映到Person實例,請檢查您的要求
+0

適配器也將能夠包含一些邏輯,如在您的示例中加入firstname + lastname – roemer

0

,你可以,很快又髒,試圖力鑄造陣列:

class Person { 

    public $id = 123; 
    public $firstName = "John"; 
    public $lastName = "Something"; 
    public $address; 
    public $city; 
    public $zipCode; 
    // etc. 

} 

$person = new Person; 
var_dump((array)$person); 

輸出:

array(6) { 
    ["id"]=> 
    int(123) 
    ["firstName"]=> 
    string(4) "John" 
    ["lastName"]=> 
    string(9) "Something" 
    ["address"]=> 
    NULL 
    ["city"]=> 
    NULL 
    ["zipCode"]=> 
    NULL 
} 

工作例如:http://ideone.com/EddQI8

相關問題