1*dc4d9dc6SAnna Dabrowska<?php 2*dc4d9dc6SAnna Dabrowska 3*dc4d9dc6SAnna Dabrowskanamespace DeepCopy\Reflection; 4*dc4d9dc6SAnna Dabrowska 5*dc4d9dc6SAnna Dabrowskause DeepCopy\Exception\PropertyException; 6*dc4d9dc6SAnna Dabrowskause ReflectionClass; 7*dc4d9dc6SAnna Dabrowskause ReflectionException; 8*dc4d9dc6SAnna Dabrowskause ReflectionObject; 9*dc4d9dc6SAnna Dabrowskause ReflectionProperty; 10*dc4d9dc6SAnna Dabrowska 11*dc4d9dc6SAnna Dabrowskaclass ReflectionHelper 12*dc4d9dc6SAnna Dabrowska{ 13*dc4d9dc6SAnna Dabrowska /** 14*dc4d9dc6SAnna Dabrowska * Retrieves all properties (including private ones), from object and all its ancestors. 15*dc4d9dc6SAnna Dabrowska * 16*dc4d9dc6SAnna Dabrowska * Standard \ReflectionClass->getProperties() does not return private properties from ancestor classes. 17*dc4d9dc6SAnna Dabrowska * 18*dc4d9dc6SAnna Dabrowska * @author muratyaman@gmail.com 19*dc4d9dc6SAnna Dabrowska * @see http://php.net/manual/en/reflectionclass.getproperties.php 20*dc4d9dc6SAnna Dabrowska * 21*dc4d9dc6SAnna Dabrowska * @param ReflectionClass $ref 22*dc4d9dc6SAnna Dabrowska * 23*dc4d9dc6SAnna Dabrowska * @return ReflectionProperty[] 24*dc4d9dc6SAnna Dabrowska */ 25*dc4d9dc6SAnna Dabrowska public static function getProperties(ReflectionClass $ref) 26*dc4d9dc6SAnna Dabrowska { 27*dc4d9dc6SAnna Dabrowska $props = $ref->getProperties(); 28*dc4d9dc6SAnna Dabrowska $propsArr = array(); 29*dc4d9dc6SAnna Dabrowska 30*dc4d9dc6SAnna Dabrowska foreach ($props as $prop) { 31*dc4d9dc6SAnna Dabrowska $propertyName = $prop->getName(); 32*dc4d9dc6SAnna Dabrowska $propsArr[$propertyName] = $prop; 33*dc4d9dc6SAnna Dabrowska } 34*dc4d9dc6SAnna Dabrowska 35*dc4d9dc6SAnna Dabrowska if ($parentClass = $ref->getParentClass()) { 36*dc4d9dc6SAnna Dabrowska $parentPropsArr = self::getProperties($parentClass); 37*dc4d9dc6SAnna Dabrowska foreach ($propsArr as $key => $property) { 38*dc4d9dc6SAnna Dabrowska $parentPropsArr[$key] = $property; 39*dc4d9dc6SAnna Dabrowska } 40*dc4d9dc6SAnna Dabrowska 41*dc4d9dc6SAnna Dabrowska return $parentPropsArr; 42*dc4d9dc6SAnna Dabrowska } 43*dc4d9dc6SAnna Dabrowska 44*dc4d9dc6SAnna Dabrowska return $propsArr; 45*dc4d9dc6SAnna Dabrowska } 46*dc4d9dc6SAnna Dabrowska 47*dc4d9dc6SAnna Dabrowska /** 48*dc4d9dc6SAnna Dabrowska * Retrieves property by name from object and all its ancestors. 49*dc4d9dc6SAnna Dabrowska * 50*dc4d9dc6SAnna Dabrowska * @param object|string $object 51*dc4d9dc6SAnna Dabrowska * @param string $name 52*dc4d9dc6SAnna Dabrowska * 53*dc4d9dc6SAnna Dabrowska * @throws PropertyException 54*dc4d9dc6SAnna Dabrowska * @throws ReflectionException 55*dc4d9dc6SAnna Dabrowska * 56*dc4d9dc6SAnna Dabrowska * @return ReflectionProperty 57*dc4d9dc6SAnna Dabrowska */ 58*dc4d9dc6SAnna Dabrowska public static function getProperty($object, $name) 59*dc4d9dc6SAnna Dabrowska { 60*dc4d9dc6SAnna Dabrowska $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); 61*dc4d9dc6SAnna Dabrowska 62*dc4d9dc6SAnna Dabrowska if ($reflection->hasProperty($name)) { 63*dc4d9dc6SAnna Dabrowska return $reflection->getProperty($name); 64*dc4d9dc6SAnna Dabrowska } 65*dc4d9dc6SAnna Dabrowska 66*dc4d9dc6SAnna Dabrowska if ($parentClass = $reflection->getParentClass()) { 67*dc4d9dc6SAnna Dabrowska return self::getProperty($parentClass->getName(), $name); 68*dc4d9dc6SAnna Dabrowska } 69*dc4d9dc6SAnna Dabrowska 70*dc4d9dc6SAnna Dabrowska throw new PropertyException( 71*dc4d9dc6SAnna Dabrowska sprintf( 72*dc4d9dc6SAnna Dabrowska 'The class "%s" doesn\'t have a property with the given name: "%s".', 73*dc4d9dc6SAnna Dabrowska is_object($object) ? get_class($object) : $object, 74*dc4d9dc6SAnna Dabrowska $name 75*dc4d9dc6SAnna Dabrowska ) 76*dc4d9dc6SAnna Dabrowska ); 77*dc4d9dc6SAnna Dabrowska } 78*dc4d9dc6SAnna Dabrowska} 79