2015-08-17 17:00:26 -07:00
< ? php
/**
* Zend Framework ( http :// framework . zend . com / )
*
* @ link http :// github . com / zendframework / zf2 for the canonical source repository
* @ copyright Copyright ( c ) 2005 - 2015 Zend Technologies USA Inc . ( http :// www . zend . com )
* @ license http :// framework . zend . com / license / new - bsd New BSD License
*/
2015-10-08 11:40:12 -07:00
namespace Zend\Hydrator ;
2015-08-17 17:00:26 -07:00
use ReflectionClass ;
2015-10-08 11:40:12 -07:00
use ReflectionProperty ;
2015-08-17 17:00:26 -07:00
class Reflection extends AbstractHydrator
{
/**
* Simple in - memory array cache of ReflectionProperties used .
2015-10-08 11:40:12 -07:00
* @ var ReflectionProperty []
2015-08-17 17:00:26 -07:00
*/
2015-10-08 11:40:12 -07:00
protected static $reflProperties = [];
2015-08-17 17:00:26 -07:00
/**
* Extract values from an object
*
* @ param object $object
* @ return array
*/
public function extract ( $object )
{
2015-10-08 11:40:12 -07:00
$result = [];
2015-08-17 17:00:26 -07:00
foreach ( self :: getReflProperties ( $object ) as $property ) {
$propertyName = $this -> extractName ( $property -> getName (), $object );
if ( ! $this -> filterComposite -> filter ( $propertyName )) {
continue ;
}
$value = $property -> getValue ( $object );
$result [ $propertyName ] = $this -> extractValue ( $propertyName , $value , $object );
}
return $result ;
}
/**
* Hydrate $object with the provided $data .
*
* @ param array $data
* @ param object $object
* @ return object
*/
public function hydrate ( array $data , $object )
{
$reflProperties = self :: getReflProperties ( $object );
foreach ( $data as $key => $value ) {
$name = $this -> hydrateName ( $key , $data );
if ( isset ( $reflProperties [ $name ])) {
$reflProperties [ $name ] -> setValue ( $object , $this -> hydrateValue ( $name , $value , $data ));
}
}
return $object ;
}
/**
* Get a reflection properties from in - memory cache and lazy - load if
* class has not been loaded .
*
* @ param string | object $input
* @ throws Exception\InvalidArgumentException
2015-10-08 11:40:12 -07:00
* @ return ReflectionProperty []
2015-08-17 17:00:26 -07:00
*/
protected static function getReflProperties ( $input )
{
if ( is_object ( $input )) {
$input = get_class ( $input );
} elseif ( ! is_string ( $input )) {
throw new Exception\InvalidArgumentException ( 'Input must be a string or an object.' );
}
if ( isset ( static :: $reflProperties [ $input ])) {
return static :: $reflProperties [ $input ];
}
2015-10-08 11:40:12 -07:00
static :: $reflProperties [ $input ] = [];
2015-08-17 17:00:26 -07:00
$reflClass = new ReflectionClass ( $input );
$reflProperties = $reflClass -> getProperties ();
foreach ( $reflProperties as $property ) {
$property -> setAccessible ( true );
static :: $reflProperties [ $input ][ $property -> getName ()] = $property ;
}
return static :: $reflProperties [ $input ];
}
}