OOP模式将一种数据格式转换为另一种数据格式

时间:2013-01-08 06:25:42

标签: php oop design-patterns

让我们说我有一个包含许多属性的类的实例。此类无法修改或扩展。

我现在需要将此实例中的一些数据传递给函数。该函数只需要一些这些属性,它不能直接使用类的实例(它需要一个关联数组),并且还需要一些实例中不存在的数据。所以我需要将实例转换为关联数组。

例如我需要转换它:

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模式来处理这种转换?我知道我可以编写一个简单的函数来从一种格式转换为另一种格式,但我想知道什么是"正确的"如果可能的话,基本上使用已知的模式。

2 个答案:

答案 0 :(得分:1)

当您要求设计模式时,Adapter Pattern可能是最合适的

在您的示例中,Person将是Adaptee,您的Adapter将扩展Array-Class并覆盖访问方法。适配器的实现可能会有所不同,因为您仍然需要决定是否要明确访问适配器字段,或者您希望封装通用访问(例如,使用反射)。

请注意,此解决方案并非真正“转换”为独立阵列,因为数据仍然在您的Person实例中得到支持,这可能会影响您的要求:

  • 由于您还想添加其他数据字段,您可能希望根据您的逻辑进一步扩展适配器。
  • 检查您的要求是否应将其他数组操作反映到Person实例

答案 1 :(得分: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