如何使用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模式()