构建对象到数组到转化器

这个案例与前一个刚好相反。在这种情况下,我们需要从对象属性中提取值,并返回一个关联数组,其中键是列名。

如何做...

1.在这个例子中,我们将建立在前面的案例中定义的Application\Generic\Hydrator\GetSet类的基础上。

namespace Application\Generic\Hydrator;
class GetSet
{
  // code
}

2.在前面的配方中定义了hydrate()方法之后,我们定义了一个extract()方法,它以一个对象作为参数。其逻辑与hydrate()方法类似,只是这次我们搜索的是getXXX()方法。再次使用 preg_match() 来匹配方法的前缀和后缀,后缀被认为是数组键。

public static function extract($object)
{
  $array = array();
  $class = get_class($object);
  $methodList = get_class_methods($class);
  foreach ($methodList as $method) {
    preg_match('/^(get)(.*?)$/i', $method, $matches);
    $prefix = $matches[1] ?? '';
    $key    = $matches[2] ?? '';
    $key    = strtolower(substr($key, 0, 1)) . substr($key, 1);
    if ($prefix == 'get') {
      $array[$key] = $object->$method();
    }
  }
  return $array;
}
}

请注意,为了方便起见,我们将 hydrate()extract() 定义为静态方法。

如何运行...

定义一个名为chap_11_object_to_array.php的调用程序,设置自动加载,并使用相应的类。

<?php
require __DIR__ . '/../Application/Autoload/Loader.php';
Application\Autoload\Loader::init(__DIR__ . '/..');
use Application\Entity\Person;
use Application\Generic\Hydrator\GetSet;

接下来,定义一个 Person 的实例,为其属性设置值。

$obj = new Person();
$obj->setFirstName('Li\'lAbner');
$obj->setLastName('Yokum');
$obj->setAddress('1DirtStreet');
$obj->setCity('Dogpatch');
$obj->setStateProv('Kentucky');
$obj->setPostalCode('12345');
$obj->setCountry('USA');

最后,以静态方式调用 new extract()方法。

$a = GetSet::extract($obj);
var_dump($a);

输出结果如下截图所示。

最后更新于