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


OOP pattern to convert one data format to another

假设我有一个包含数十个属性的类实例。这个类不能被修改或扩展。

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

例如,我需要转换这个:

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

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

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

请注意,这个解决方案并不是一个真正的"转换"到一个独立的数组,因为数据仍然支持在你的Person实例中,这对你的需求可能有影响:

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

您可以快速地尝试强制转换到array:

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