如何使用Zend或将具有私有属性的PHP对象转换为数组?

如何使用Zend或将具有私有属性的PHP对象转换为数组?,php,arrays,zend-framework,zend-framework3,zend-hydrator,Php,Arrays,Zend Framework,Zend Framework3,Zend Hydrator,代码 class Composite { private $a; private $b; /** * * @return the $a */ public function getA() { return $this->a; } /** * * @return the $b */ public function getB() {

代码

class Composite
{

    private $a;

    private $b;

    /**
     *
     * @return the $a
     */
    public function getA()
    {
        return $this->a;
    }

    /**
     *
     * @return the $b
     */
    public function getB()
    {
        return $this->b;
    }

    /**
     *
     * @param field_type $a            
     */
    public function setA($a)
    {
        $this->a = $a;
    }

    /**
     *
     * @param field_type $b            
     */
    public function setB($b)
    {
        $this->b = $b;
    }
}

$composite = new Composite();
$composite->setA(1);
$composite->setB(new Composite());
$composite->getB()->setA(2);
$composite->getB()->setB(3);

$x = new \Zend\Hydrator\ClassMethods();
print_r($x->extract($composite));
输出

Array
(
    [a] => 1
    [b] => Composite Object
        (
            [a:Composite:private] => 2
            [b:Composite:private] => 3
        )

)
问题

我的目标是从一个对象中生成一个数组,其中数组可以是递归的。Zend提供了一个提取对象属性并将其放入数组的工具。但它只在第一级执行,并且不会进一步递归(即,当我希望将私有成员转换为数组时,它会像上面那样保留私有成员)

有没有办法用这样的对象生成数组?注意:我有不同的对象作为私有成员,它们与这个简化示例中的对象不同

所讨论的对象不继续递归地提取私有对象属性


我会接受其他不使用Hydrator的答案,只要它们相当优雅,但如果出现使用
\Zend\Hydrator
的答案,我会接受该答案。

您可以覆盖
Zend\Hydrator\ClassMethods
,如下所示:

namespace Application\Model;
use Zend\Hydrator\ClassMethods as ZendClassMethods;
class ClassMethods extends ZendClassMethods
{
  public function extractValue($name, $value, $object = null)
  {
    $value = parent::extractValue($name, $value, $object);
    if (is_object($value)) {
        return $this->extract($value);
    } else {
        return $value;
    }
  }
}
然后使用
Application\Model\ClassMethods
而不是
Zend\Hydrator\ClassMethods
,如下所示

use Application\Model\ClassMethods;
use Application\Model\Composite;

    $composite = new Composite();
    $composite->setA(1);
    $composite->setB(new Composite());
    $composite->getB()->setA(2);
    $composite->getB()->setB(3);

    $x = new ClassMethods();
    print_r($x->extract($composite));

有几种方法可以做到这一点,您可以检查zend aggregateHydrator(此处:)或strategy模式()