2

代码

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,它可以提取对象属性并将它们放入数组中。但它只在第一级这样做并且它不会进一步递归(即当我希望将它们变成一个数组时,它保留了上面的私有成员)。

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

有问题的 Hydrator 不会继续递归地提取私有对象属性。

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

4

1 回答 1

1

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));
于 2017-03-17T17:28:36.030 回答