2

数十のプロパティを含むクラスのインスタンスがあるとしましょう。このクラスは変更または拡張できません。

ここで、このインスタンスから関数にデータを渡す必要があります。この関数には、これらのプロパティのいくつかが必要であり、クラスのインスタンスを直接使用することはできず(連想配列が必要です)、インスタンスに存在しないデータも必要です。したがって、インスタンスを連想配列に変換する必要があります。

たとえば、これを変換する必要があります。

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パターンはありますか?ある形式から別の形式に変換する簡単な関数を作成できることは知っていますが、それを行うための「適切な」方法を知りたいのですが、基本的には可能であれば既知のパターンを使用します。

4

2 に答える 2

2

デザインパターンを求めているので、アダプターパターンが最も適切なパターンかもしれません

あなたの例では、 Person は Adaptee になり、 Adapter は Array-Class を拡張してアクセスメソッドをオーバーライドします。アダプティ フィールドに明示的にアクセスするか、一般的なアクセスをカプセル化するか (リフレクションなど) を決定する必要があるため、アダプターの実装は異なる場合があります。

このソリューションは、スタンドアロン配列への実際の「変換」ではないことに注意してください。データは Person のインスタンスにまだバックアップされているため、要件に影響を与える可能性があります。

  • 他のデータ フィールドも追加したいので、ロジックに従ってアダプターをさらに拡張することができます。
  • 他の配列操作を Person インスタンスに反映する必要があるかどうか、要件を確認してください
于 2013-01-09T09:06:09.470 に答える
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

于 2013-01-08T06:31:25.510 に答える