Bir nesneye dizi çıktısı dönüştürmek için iyi bir strateji?

3 Cevap php

Ben bir komut satırı programı dizi çıktısı alarak ve bir PHP nesnesi haline ayrıştırma. Bunu yapmak için çok basit bir şekilde bu örneği düşünün:

$output = explode("\n", shell_exec(myProg));
$obj = new MyObject();

$offset_field1 = 0;
$offset_field2 = 1;

$obj->Field1 = $output[$offset_field1];
$obj->Field2 = $output[$offset_field2];

Bu alanların sayısı artar, özellikle, biraz hantal. Daha az sert bir şekilde aynı feat başarmak için daha iyi bir tasarım deseni veya yöntem var mı?

3 Cevap

Neden nesne atama kodu koymak değil mi?

class MyObject
{
    public function __construct(array $data)
    {
        $this->Field1 = $data['keyname1'];
        $this->Field2 = $data['keyname2'];
        ...
    }
}

ya da olsun sihirli yöntemini kullanın.

class MyObject
{
    protected $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function __get($key)
    {
        $map = array('Field1' => 1, 'Feild2' => 2, ...);
        if (isset($map[$key])) {
            return $this->data[$map[$key]];
        }
    }
}

Ben bu işe sanırım:

$output = explode("\n", shell_exec(myProg));
$obj = new MyObject();

foreach ($output as $key => $value)
{
    $obj->{'Field' . ($key + 1)} = $value;
}

Sizin programm outpout gelen alan adını tahmin edilemez gibi görünüyor, bir yerde tanımlamak zorunda kalacak.

$key_map = array('field_name1', 'field_name2', 'etc');

$obj = new MyObject();

foreach(explode("\n", shell_exec(myProg)) as $k => $v)
{
  if(isset($key_map($k))
    $obj->$key_map[$k] = $v;
}